JFreeChart-ExtendedCategoryAxis-軸の値に補足説明をつける


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ExtendedCategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.util.SortOrder;

import jp.avaj.lib.def.ArSortDir;

/**
■ JFreeChart-ExtendedCategoryAxis-軸の値に補足説明をつける

・本サンプルは商品の地域別売上を示すもの.
・地域の名前での表示に加えて、内部的に使用している地域コードを付加する.

 */
public class Chart18_09 {
  // 目次-バーチャート(BarChart)
  A_Chart07 a_Chart07;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  static final String ITEM_0 = "商品0";
  static final String ITEM_1 = "商品1";
  static final String DOMAIN_0 = "地域0";
  static final String DOMAIN_1 = "地域1";
  static final String DOMAIN_2 = "地域2";

  public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    //
    // DefaultCategoryDatasetを使用する
    // DefaultCategoryDatasetの作成機能は、ArcDefaultCategoryDatasetにまとめられている
    // DefaultCategoryDatasetは、いくつかのデータ構造から作成できる
    // ここでは二段Mapから作成する.詳細はArcDefaultCategoryDatasetの解説を参照.
    // バーチャートの表示順制御については、ArcDefaultCategoryDatasetの解説を参照のこと.
    DefaultCategoryDataset catDataSet = createData();
      //
    ExtendedCategoryAxis xAxis = new ExtendedCategoryAxis("商品");
    // 地域コードを付加する ⇒ addとなっているが、複数追加はできない、最後が有効.
    xAxis.addSubLabel("地域0","10");
    xAxis.addSubLabel("地域1","11");
    xAxis.addSubLabel("地域2","12");
    NumberAxis yAxis = new NumberAxis("売上");
    BarRenderer renderer = new BarRenderer();
    CategoryPlot catPlot = new CategoryPlot(catDataSet,xAxis,yAxis,(CategoryItemRenderer)renderer);
    catPlot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
    catPlot.setColumnRenderingOrder(SortOrder.ASCENDING);
    catPlot.setRowRenderingOrder(SortOrder.ASCENDING);
    //catPlot.setOrientation(PlotOrientation.HORIZONTAL);
    JFreeChart jfreeChart = new JFreeChart("売上集計",(Plot)catPlot);
    //
    ChartFrame cFrame = new ChartFrame("売上集計",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
  private static DefaultCategoryDataset createData() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
  {
    // 元データの二段Mapの作成
    Map<String,Map<String,Chart07_04_Data>> mapMap = new HashMap<String,Map<String,Chart07_04_Data>>();
    {
      Map<String,Chart07_04_Data> map = new HashMap<String,Chart07_04_Data>();
      map.put(  DOMAIN_0,new Chart07_04_Data("A",100.0D));
      map.put(DOMAIN_1,new Chart07_04_Data("B",44.0D));
      map.put(DOMAIN_2,new Chart07_04_Data("C",93.0D));
      mapMap.put(ITEM_0,map);
    }
    {
      Map<String,Chart07_04_Data> map = new HashMap<String,Chart07_04_Data>();
      map.put(DOMAIN_0,new Chart07_04_Data("D",80.0D));
      map.put(DOMAIN_1,new Chart07_04_Data("E",75.0D));
      map.put(DOMAIN_2,new Chart07_04_Data("F",15.0D));
      mapMap.put(ITEM_1,map);
    }
    // DefaultCategoryDatasetに変換する
    // 商品名と地域名を昇順にソートしてDatasetを作成する
    // 値を取得するフィールド名を指定する
    DefaultCategoryDataset catDataSet = ArcDefaultCategoryDataset.create(mapMap,"value",ArSortDir.ASCEND,ArSortDir.ASCEND);
    return catDataSet;
  }

  public static class Chart07_04_Data {
    public Chart07_04_Data(String tantou,Double value) {
      this.tantou = tantou;
      this.value = value;
    }
    private String tantou;
    private Double value;
    public String getTantou() {
      return tantou;
    }
    public void setTantou(String tantou) {
      this.tantou = tantou;
    }
    public Double getValue() {
      return value;
    }
    public void setValue(Double value) {
      this.value = value;
    }
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/2169d32e-bcca-e7bf-737b-8123f79f2c77.png)