ファイヤープロジェクト
複数のグラフエリアを並べる(JFreechart 0.9.16)
2004-04-04T19:00+09:00   matsu
SeriesDatasetを使用すると,一つのグラフエリアに複数のグラフを表示できることは,今までのサンプルで示した.本頁ではさらにそのグラフエリアを並べて表示してみる.
JFreeChartでは,グラフ表示のJPanelを作成することができる.そのJPanelを並べれば,グラフエリアを並べたことにはなる.本頁ではこの方法に寄らず,JFreeChartで提供されている機能を使用してグラフエリアを並べる.JFreeChart提供の機能を使用するメリットは,複数のグラフエリアで軸を共有することができる点である.本頁のために作成したサンプルの画像を以下に示す.
上のサンプルでは,グラフエリアを縦に並べ,どのグラフエリアも一つの横軸を共有している.JPanelを使用した場合はそれぞれのグラフエリアに横軸が設定されるので,こうはできない(※).以降,上のような複数のグラフエリアを持つグラフを便宜上CombinedChartと呼ぶ.ではサンプルのコード.
このコードは自作のDatasetであるMyXYDataset2に依存する.
今回の登場クラスについて整理しておく.
※ もちろん要求される出力によっては各グラフエリアにそれぞれ横軸がある方がよい場合もある.
サンプルではCombinedChartはSampleMeterChartクラスのcreateCombinedChartメソッドで行なっている.ChartFactoryはCombinedChartの作成をサポートしていないので,JFreeChartのコンストラクタを直接呼び出す.
JFreeChart chart = new JFreeChart("SampleCombinedChart",
                                  JFreeChart.DEFAULT_TITLE_FONT, plot, true);
で,本頁の話の中心は第三引数plotである.これは先のクラス図に示した,CombinedDomainXYPlotのインスタンスである.これにXYPlotを複数格納することによって,複数のグラフエリアを持つグラフを作成することができる.CombinedDomainXYPlotはその名のとおり,所有するXYPlotの横軸(Domain Axis)を結合する.逆にCombinedRangeXYPlotやCombinedRangeCategoryPlotがある.前者は所有するXYPlotの縦軸(Range Axis)を結合する.後者は所有するCategoryPlotの縦軸(Range Axis)を結合する.これは棒グラフの結合に使用する.
前節でCombinedDomainXYPlotのインスタンスを作成し,設定することを目標とすればよいことがわかった.そこでまず,CombinedDomainXYPlotを作成する.
NumberAxis domainAxis = new NumberAxis("Domain");
domainAxis.setAutoRange(true);
CombinedDomainXYPlot plot = new CombinedDomainXYPlot(domainAxis);
CombinedDomainXYPlotの生成には複数のグラフエリアで共有するdomainAxisが必要である.この横軸は全グラフエリアで共有となるので,CombinedDomainXYPlotが所有するXYPlotにはdomainAxisを持たせる必要はない.次にXYPlotを作成し,CombinedDomainXYPlotに渡す.
// XYDatasetの作成
double radius[] = new double [i + 1];
for (int j = 0; j < radius.length; j++) {
    radius[j] = i * j + 1;
}
data = new MyXYDataset2("Dataset" + i + "-", rand.nextDouble(), rand.nextDouble(), radius);
// 縦軸
valueAxis = new NumberAxis("Axis" + i);
valueAxis.setAutoRange(true);
valueAxis.setAutoRangeIncludesZero(false);
// レンダラ
renderer = new StandardXYItemRenderer();
// 横軸を共有するグラフの作成
subplot = new XYPlot(data, null, valueAxis, renderer);
MyDataset2,縦軸とレンダラを作成し,これらを使用してXYPlotインスタンスであるsubplotを作成している.このsubplotが各グラフエリアとなる.縦軸は各グラフエリアで別々となるので,各subplotに設定が必要である(※).subplotが出来たら,CombinedDomainXYPlotに設定する.
// CombinedChartへ登録
plot.add(subplot, i + 1);
以上をグラフエリア毎に行なうことで,それらの横軸を共有するCombinedDomainXYPlotができる.
※ CombinedRangeXYPlotとCombinedRangeCategoryPlotの場合は逆である.つまり,これらに縦軸を設定し,各グラフエリアのXYPlot,CategoryPlotそれぞれにに横軸を設定する.
matsu(C)
Since 2002
Mail to matsu