目次 ⇒ JFreeChartサンプル
package jp.avaj.lib.chart;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeriesCollection;
import jp.avaj.lib.algo.ArDate;
import jp.avaj.lib.algo.ArMap;
/**
■ JFreeChart-時系列チャート/TimeSeriesCollectionをMap<T0,List<T1>>から作成
・X値は日時のデータで、その基底クラスはRegularTimePeriod.
・X軸はDateAxisを使用する
・DatasetはTimeSeriesCollectionをMap<T0,List<T1>>から作成する
・TimeSeriesCollectionはArcTimeSeriesCollectionを使用して以下から作成することができる
・Map<T0,List<T1>>-T1オブジェクトから日時と値を取得する、シリーズキーはT0
・ArListOnMap<T0,T1>-T1オブジェクトから日時と値を取得する、シリーズキーはT0
・ArMapOnMap<T0,T1,T2>-T2オブジェクトから値を取得する、日時とシリーズキーは、T0またはT1オブジェクトから取得する.
・T0:日時、T1:シリーズキーあるいはT0:シリーズキー、T1:日時
・ArMatrix<T0,T1,T2>-T2オブジェクトから値を取得する、日時とシリーズキーは、T0またはT1オブジェクトから取得する.
・T0:日時、T1:シリーズキーあるいはT0:シリーズキー、T1:日時
・本例ではMap<T0,List<T1>>からTimeSeriesCollectionを作成する.
*/
public class Chart16_01 {
// 目次-時系列データの表示.
A_Chart15 a_Chart15;
// 目次-Artery-JFreeChart用のライブラリ
A_Chart00 a_LibChartSampeContents;
public static void main(String[] args) throws Exception {
// 表示データを作成する
TimeSeriesCollection ds;
{
// 元データを取得する
Map<String,List<Chart16_01_Data>> listOnMap = createData();
// 必要ならばシリーズキーを変換できる.nullを指定すれば変換しない、ここで"b"⇒"B"の変換を行う
Map<String,String> names = ArMap.construct("b=B");
// 日時と値のフィールド名を指定する、日時の単位はDayに変換する
ds = ArcTimeSeriesCollection.create(listOnMap,Day.class, names,"date","sales");
}
// レンダラ
// 最初の引数はラインを引くかどうか⇒今回はラインは引く
// 次の引数はデータの場所に形を表示するか否か⇒今回は形を表示する.
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true,true);
// X軸はDateAxis
DateAxis xAxis = new DateAxis();
// 軸の表示単位を設定する,1は一日単位の意味,2にすれば二日ごとに表示する.
xAxis.setTickUnit(new DateTickUnit(DateTickUnitType.DAY,1));
NumberAxis yAxis = new NumberAxis();
// Plotを作成してチャートを表示する
XYPlot xyPlot = new XYPlot(ds,xAxis,yAxis,(XYItemRenderer)renderer);
JFreeChart jfreeChart = new JFreeChart("売上推移",(Plot)xyPlot);
ChartFrame cFrame = new ChartFrame("売上推移",(JFreeChart)jfreeChart); // (1)
cFrame.pack();
cFrame.setVisible(true);
}
// 表示データを作成する
private static Map<String,List<Chart16_01_Data>> createData() {
// 商品名の定義
final String[] items = new String[]{"A","b","C"};
// 最初の日
final ArDate startDate = new ArDate(2030,7,1);
Random ran = new Random();
//
Map<String,List<Chart16_01_Data>> listOnMap = new HashMap<String,List<Chart16_01_Data>>();
for (int item=0; item<items.length; item++) {
ArDate arDate = (ArDate)startDate.clone();
List<Chart16_01_Data> list = new ArrayList<Chart16_01_Data>();
listOnMap.put(items[item],list);
for (int day=0; day<5; day++) {
// 売上 ⇒ サンプルなので適当.
int sales = item*10+ran.nextInt(10);
list.add(new Chart16_01_Data((ArDate)arDate.clone(),sales));
// 次の日
arDate.forward(1);
}
}
return listOnMap;
}
/** 表示データを格納するクラス */
public static class Chart16_01_Data {
public Chart16_01_Data(ArDate date,int sales) {
this.date = date;
this.sales = sales;
}
private ArDate date;
private int sales;
public ArDate getDate() {
return date;
}
public void setDate(ArDate date) {
this.date = date;
}
public int getSales() {
return sales;
}
public void setSales(int sales) {
this.sales = sales;
}
}
}