目次 ⇒ 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;
}
}
}