JFreeChart-パイチャート-DefaultPieDatasetの作成


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

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

import java.awt.Color;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.Plot;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;

import jp.avaj.lib.def.ArSortDir;

/**
JFreeChart-パイチャート-DefaultPieDatasetの作成
・パイチャートを作成するためのユーティリティクラスArcDefaultPieDatasetを使用してパイチャートを作成する
・DefaultPieDatasetの作成方法には以下の方法がある
 ・キーと値をList,Set,Mapの値のフィールドから取得する
 ・キーはMapのキー、値はMapの値のフィールドから取得する
 ・キーはMapのキー、値はMapの値そのもの(Mapで値がNumber)


・注意事項、DefaultPieDatasetへのデータの挿入順について.
  1.DefaultPieDatasetへのデータの挿入順はグラフでの表示に影響する.
    ・内部的にはインデックスで管理されているようだが、それとキーを制御する方法が提供されていない.
    ・キーまたは値でソートすることはできる.しかしその表示順で満足できない場合は、挿入順を制御する.
  2.DefaultPieDataset生成時にキーのソート順を指定できるようになっている.
  3.ソート順にnullを指定するとソートしないで挿入される.
  4.ソート順を指定して表示順が満足できない場合は、直接DefaultPieDatasetを生成する必要がある.

 */
public class Chart04_01 {
  // 目次-パイチャート(PieChart)
  A_Chart04 a_Chart04;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;


  /** 商品の売上数のデータからパイチャートを生成する */
  public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    DefaultPieDataset dataSet;

    // PieDatasetを作成するにはいくつかの方法がある
    // 以下のどれでも動作する-本例では最後で作成したデータが使用されている
    {
      // キーと値を値のフィールドから取得する(List,Set)⇒同じなのでListで示す
      {
        List<Amount> list = createAmountList();
        // 商品名と売上数のフィールド名を指定する
        dataSet = ArcDefaultPieDataset.createDataset(list,"name","count",ArSortDir.ASCEND);
      }
      // キーと値を値のフィールドから取得する(Map)
      {
        Map<String,Amount> map = createAmountMap();
        // 商品名と売上数のフィールド名を指定する
        dataSet = ArcDefaultPieDataset.createDataset(map,"name","count",ArSortDir.ASCEND);
      }
      // キーはMapのキー、値は値のフィールドから取得する(Map)
      {
        Map<String,Amount> map = createAmountMap();
        // 売上数のフィールド名を指定する、商品名はMapのキーを使用する
        dataSet = ArcDefaultPieDataset.createDataset(map,"count",ArSortDir.ASCEND);
      }
      // キーはMapのキー、値は値そのもの(Mapで値がNumber)
      {
        Map<String,Integer> map = createAmountCount();
        // 商品名はMapのキーを使用する、売上数はMapの値
        dataSet = ArcDefaultPieDataset.createDataset(map,ArSortDir.ASCEND);
      }
    }

    // Plotを生成する
    PiePlot piePlot = new PiePlot((PieDataset)dataSet);
    // 3Dパイチャートならば次のようにする
    //piePlot = (PiePlot)new PiePlot3D((PieDataset)dataSet);

    // 商品cを強調して表示する,値は結果を見て調整する
    piePlot.setExplodePercent("商品c",0.1D);

    // 商品bの色を変える,注、指定しなければJFreeChartが勝手に決める
    piePlot.setSectionPaint("商品b", Color.black);

    // チャートを生成する
    JFreeChart jfreeChart = new JFreeChart("商品別売上高",(Plot)piePlot);
    //
    ChartFrame cFrame = new ChartFrame("商品別売上高",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }

  private static List<Amount> createAmountList() {
    List<Amount> list = new ArrayList<Amount>();
    Collection<Amount> coll = baseMap.values();
    for (Amount amount : coll) {
      list.add(amount);
    }
    return list;
  }

  private static Map<String,Amount> createAmountMap() {
    return baseMap;
  }

  private static Map<String,Integer> createAmountCount() {
    Map<String,Integer> map = new HashMap<String,Integer>();
    Set<String> names = baseMap.keySet();
    for (String name : names) {
      map.put(name,baseMap.get(name).getCount());
    }
    return map;
  }

  /////// テストデータを作るための元データ
  private static Map<String,Amount> baseMap;
  static {
    baseMap = new HashMap<String,Amount>();
    baseMap.put("商品a",new Amount("商品A",200));
    baseMap.put("商品b",new Amount("商品B",150));
    baseMap.put("商品c",new Amount("商品C",90));
    baseMap.put("商品d",new Amount("商品D",120));
    baseMap.put("商品e",new Amount("商品E",230));
  };

  /**
   *  売上数のクラス.
   *  他のフィールドがあってもよいが、本サンプルに必要な商品名と売上数のみを定義する
   */
  public static class Amount {
    public Amount(String name,Integer count) {
      this.name = name;
      this.count = count;
    }
    /** 商品名 */
    private String name;
    /** 売上数 */
    private Integer count;
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public Integer getCount() {
      return count;
    }
    public void setCount(Integer count) {
      this.count = count;
    }
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/c75d972e-9302-8447-34a2-17e995619b8b.png)