ファイヤープロジェクト
時間軸を持つグラフの作成(JFreechart 0.9.16)
2004-02-14T21:30+09:00   matsu
横軸を時間として適切にスケーリングしてグラフ表示したい場合もある.そこでJFreeChartを使用して時間軸を持つグラフを作成したみた.
本頁では横軸を時間軸とするグラフを作成する.これを便宜上TimeSeriesChartと呼ぶ.TimeSeriesChartはDatasetとしてXYDatasetのサブクラスであるTimeSeriesCollectionをもち,年月日分時秒ミリ秒をラベルに適切に表示したり,スケーリングを行なったりしてくれる.TimeSeriesChartはデフォルトではXYLineChartと同様に折れ線グラフであるが,ここではそれを棒グラフに変更する.ではサンプル.
今回の主な登場クラスを整理しておく.
今回は,以下の三つのメソッドでJFreeChartがらみの処理を行なっている.
  • workTimeSeriesChart
  • getTimeSeriesChart
  • configTimeSeriesChart
workTimeSeriesChartは棒グラフの頁のサンプルとほとんど同じであるので,本頁では説明を省略する.サンプルを実行して作成されたPNG画像を以下に示す.
サンプルでは,TimeSeriesChartの作成をgetTimeSeriesChartメソッド内で行なっている.表示データはcreateXYDatasetメソッドで作成している.createXYDatasetメソッドでは,XYDatasetのサブクラスであるTimeSeriesCollectionオブジェクトを作成して,これに複数のTimeSeriesオブジェクトを格納して返す.
TimeSeriesCollection timeSeriesCollection = new TimeSeriesCollection();

for (int series = 0; series < SERIES_COUNT; series++) {
    timeSeriesCollection.addSeries(createTimeSeries(series));
}
return timeSeriesCollection;
TimeSeriesオブジェクトの作成とデータの格納はcreateTimeSeriesオブジェクトで行なっている.まずTimeSeriesオブジェクトを作成する.
TimeSeries timeSeries = new TimeSeries("Series" + seriesNo,
				       "timeSeries domain",
				       "timeSeries range",
				       Second.class);
第一引数はシリーズ名,第二,第三引数はドメイン記述と範囲記述らしいが,何に使用されるのかよくわからない.第四引数はTimeSeries作成での肝である.TimeSeriesオブジェクトには後でaddメソッドでデータを格納するのだが,その第一引数に使用するオブジェクトのクラスを問題の第四引数に指定する.以下はサンプルでのaddメソッド呼び出しである.
try {
	timeSeries.add(new Second(second, minute, hour, 1, 1, 2004), (seriesNo + 1) * value);
} catch (SeriesException e) {
	System.out.println("" + value + ":::" + second + ":"
			   + minute + ":" + hour);
	i--;
	continue;
}
サンプルではaddメソッドの第一引数にSecondオブジェクトを使用する.したがってTimeSeriesのコンストラクタの第四引数をSecondo.classと指定した.TimeSeriesのコンストラクタにはこれを指定しないものもあるが,その場合はaddする際の第一引数はMinute型でなければならない.また,TimeSeriesオブジェクトのaddメソッドの第二引数は,第一引数で指定した時間に対する値(縦軸値)である.addメソッドは場合によってはSeriesExceptionを投げる.これは,同一のTimeSeriesオブジェクトに対して登録済みに時間でさらにaddしようとした(二重登録)場合などに投げられる.サンプルではこの例外をキャッチしたらループ変数を戻してやりなおすようにした.
サンプルではconfigTimeSeriesChartメソッドで,描画方法と棒グラフの軸に関する設定を行なっている.プロットはXYPlotオブジェクトである.まず軸に対してAutoRangeを指定.
/* 横軸の設定 */
ValueAxis xAxis = xyPlot.getDomainAxis();
xAxis.setAutoRange(true);

/* 縦軸の設定 */
ValueAxis yAxis = xyPlot.getRangeAxis();
yAxis.setAutoRange(true);
ちなみにここではそこまで特定する必要はないが,横軸はDateAxis,縦軸はNumberAxisである(それぞれValueAxisのサブクラス).JFreeChartでは描画方法はPlotが持っているRendererによって決定される(※).また,TimeSeriesChartはデオフォルトでは折れ線グラフとして表示される.そこで,TimeSeriesChartのデフォルトのRendererのクラス名を表示して,さらに棒グラフとして表示するようにXYBarRendererをセットしてみた.
/* レンダラの設定 */
System.out.println("Change renderer to XYBarRenderer from "
		   + xyPlot.getRenderer().getClass().getName());
xyPlot.setRenderer(new XYBarRenderer());
出力によると,デフォルトのRendererはStandardXYItemRendererであった.
Change renderer to XYBarRenderer from org.jfree.chart.renderer.StandardXYItemRenderer
※ というよりRendererが描画の細かい作業を行なっている(Strategyパターン).ちなみにRendererは便宜上の私が勝手に呼んでいるだけで,そいういう名前のクラスやインタフェースはない(パッケージ名にはある).
matsu(C)
Since 2002
Mail to matsu