円グラフの作成(JFreechart 0.9.16)
JFreeChartを使用して円グラフを作成したみた.
サンプルを通してJFreeChartを使用する際の全体の流れを記述してみる.以下はJFreeChartを使用して円グラフを表示し,さらにファイルにPNG形式で保存するプログラムである.
このサンプルを実行して作成されたPNGファイルを以下に示す.
ここでは示さないが,ウィンドウでも同様の円グラフが表示された.このサンプルにおいてJFreeChart使用の流れを示すメソッドは以下の二つである.
- workPieChart
- getPieChart
JFreeChartでは,まずJFreeChartオブジェクトを作成する.サンプルではその具体的な作業はgetPieChartで行なっている.ここではJFreeChartを使用して何ができるのかを示す.サンプルにおいてJFreeChartを使用しているメソッドはworkPieChartである.このメソッドではJFreeChartオブジェクトを使用して以下を行なっている.
- ウィンドウにグラフを表示
ChartPanel cPanel = new ChartPanel (pieChart); content.add(cPanel);
ここではPanelを作成したが他にChartFrameを作成することもできる.ChartFrame cFrame = new ChartFrame (pieChart);
- ファイルに保存
File outFile = new File("./piechart.png"); try { ChartUtilities.saveChartAsPNG(outFile, pieChart, 500, 500); } catch(IOException e) { e.printStackTrace(); }ここではPNG形式で保存しているが,ChartUtilitiesには他にsaveChartAsJPEGというJPEG形式で保存するメソッドもある.
サンプルではgetPieChartで円グラフ用JFreeChartオブジェクト(以下便宜上PieChartと呼ぶ※)を作成して描画に関していくつかの操作を行なっている.まずPieChartの作成は以下のステップを踏む.
- 円グラフのデータの作成
- 次のステップでCategoryDatasetオブジェクトを作成するために,double型の二次元配列で円グラフのデータを作成する.
double[][] data = new double[][] {{1.0, 2.0, 3.0, 4.0}, {5.0, 6.0, 7.0, 8.0}};PieChartの作成では,後のステップでこれらの内一行あるいは一列のみを円グラフのデータとして使用する. - CategoryDatasetオブジェクトの作成
- JFreeChartへのグラフデータ格納型CategoryDatasetのオブジェクトを作成.DatasetUtilitiesにはCategoryDatasetオブジェクトの作成メソッドがいろいろあるが,ここではおそらく最も簡単な方法をとる.
CategoryDataset cData = DatasetUtilities.createCategoryDataset("RowKey ", "ColKey ", data);createCategoryDatasetの第一引数と第二引数はデータの行及び列の見出しである.グラフ中に各データの見出しを表示したい場合があるが,これらはそれに利用される.これらはString型の配列とした場合はデータの各値に任意の文字列を指定できる.配列ではなく単にString型の場合はサンプルの出力結果のようにその文字列の後に1,2,3...と連番が振られる.配列とキーの関係を以下に示しておく.ColKey1 ColKey2 RowKey1 Datum1 Datum2 RowKey2 Datum3 Datum4 - CategoryDatasetオブジェクトを円グラフ向けのPieDatasetオブジェクトに変換
- 前ステップで作成したCategoryDatasetオブジェクトをPieChart向けのグラフデータ格納型PieDatasetに変換する.
PieDataset pieData = DatasetUtilities.createPieDatasetForRow(data, 0); // PieDataset pieData = DatasetUtilities.createPieDatasetForColumn(cData, 0);;
前ステップで作成したDatasetオブジェクトには第三引数でとった二次元配列のデータが全て格納されている.円グラフではその二次元配列の一行あるいは一列しか表示しないのでここで行あるいは列を指定して抽出し,PieDatasetオブジェクトにしている.上で実行しているのは0番目の行の抽出である.第二引数で何番目の行を抽出するかを指定する(ここでは0を指定).これで抽出される見出しは列語との見出しである.メソッド名とは反転するので注意すること(前ステップの表参照).コメントアウトされている方は0番目の列の抽出である.やはり第二引数で何番目の列を抽出するかを指定する. - PieDatasetをデータにしてJFreeChartを作成
- ようやくPieChartを作成できる.
JFreeChart pieChart = ChartFactory.createPieChart ("SamplePieChart", pieData, true, true, false);第一引数は表のタイトルである.第二引数はPieDatasetオブジェクト.第三引数以降の説明を以下に示す.- 第三引数
- データの説明が必要かどうか.サンプルではグラフの下部に各色ごとの説明が表示されるが,第三引数をfalseにすると説明が表示されなくなる.説明の表示位置は変更可能.以下は表の説明を右側に表示するように設定する.
Legend legend = pieChart.getLegend(); legend.setAnchor (Legend.EAST);
- 第四引数
- ツールチップスの作成するかどうか.詳細は省略.
- 第五引数
- URLを設定するかどうか.詳細は省略.
※ JFreeChartは円グラフや棒グラフなど,あらゆるグラフのためのデータを格納する.グラフの種類による違いは,保持しているPlotに依存するようだ(他にも依存するものがあるかもしれない).すなわち円グラフならPlotは実際にはそのサブクラスであるPiePlotである.すなわちJFreeChartのサブクラスとしてPieChartやBarChartはないが,こういう呼び方をすると便利な場合があるので,その場合にはPieChartやBarChartという言葉を使用する.
サンプルのgetPieChartメソッドの後半は,PieChartオブジェクトの操作を行なっている.ここでの操作はグラフを表示する際の細かい指定である.これを行なうには,PieChartオブジェクトからPiePlotオブジェクトを取り出して,いくつかのメソッドを呼び出す.サンプルでは以下を行なっている.
- 楕円を許可する
- 上位から円グラフをパネルやファイルに出力際,表示エリアが正方形でない場合がある.ウィンドウに表示した際には,ユーザが任意にウィンドウの大きさを縦横に変更したりする.この際,円グラフを楕円にしてもよい場合はfalse,円に維持したい場合にはtrueを以下の関数の引数に指定する.
piePlot.setCircular(false);
- 半径の指定
- 円グラフの半径を指定する.半径をrとすると,0<r<=1でなければならない.
piePlot.setRadius(0.60);
- 円グラフから分離する部分と距離を指定する
- 円グラフでは,強調したい部分を円から少し分離して表示したいことがある.以下は(0から数えて)1番目(第一引数)のデータを0.4(第二引数)円から分離する指定である.
piePlot.setExplodePercent(1, 0.4);
第二引数に1.0/rを指定すると,円グラフの円弧上に分離した部分の中心がくるようだ.
先にCategoryDatasetオブジェクトをPieDatasetオブジェクトに変換し,これをChartFactory.createPieChartに渡してJFreeChartを作成した.この方法だと,作成されるPieChartにはもとのCategoryDataset内のデータ配列の一行あるいは一列分の円グラフしか表示されない.これを行ずつあるいは列ずつの円グラフを並べて表示するPieChartを作成するには,ChartFactory.createPieChartのオーバーロードメソッドを使用する.以下はサンプルのgetPieChartメソッド内のcreatePieChartをこのオーバーロードメソッドで作成する例である.
上のように複数の円グラフを同時に作成する場合には,円グラフ後とにキーの値が表示される.
JFreeChart pieChart = ChartFactory.createPieChart ("SamplePieChart",
cData, PiePlot.PER_ROW,
true, true, true);
これを使用すると,CategoryDatasetオブジェクトcDataに格納されている配列の行ごとに円グラフを作成する.サンプルでこれを実行すると,2つの円グラフが作成される.列ごとに作成したい場合はPiePlot.PER_COLUMNを指定する.以下にこれで作成したPNGファイルを示す(※).
※ なんかExceptionが吐かれたので,
piePlot.setExplodePercent(1, 0.5);はコメントアウトした.

