0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-30

目次 ⇒ JFreeChartサンプル

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?