(0)目次&概説
(1) 記事の目的
(1-1) 目的
(2) JFreeChartの概要
(2-1) JFreeChartとは?
(2-2) JFreeChartのアーキテクチャについて
(3) JFreeChartの導入手順
(3-1) ライブラリのダウンロード
(3-2) ライブラリの配置
(3-3) ビルドパスの設定
(4) JFreeChartサンプルプログラム
(4-1) 円グラフサンプル(PieChart)
(4-2) 折れ線グラフサンプル(LineChart)
(4-3) XY折れ線グラフサンプル(XYLineChart)
(1) 記事の目的
(1-1) 目的
今回はJavaで各種グラフ(折れ線グラフや円グラフ等)を「簡単に」描画する方法を紹介するという目的で「JFreeChart」を用いた方法を紹介します。
(2) JFreeChartの概要
(2-1) JFreeChartとは?
高品質なチャート画像の生成を行うためのライブラリ群で、グラフの元になるデータを与えるだけで各種グラフの描画が可能です(円グラフ/折れ線グラブ/棒グラフ/レーダーチャートなど)。様々な出力形式が可能で、JavaのSwingやJavaFX(ともにJavaのGUIツールキット基盤技術)をはじめ、画像ファイル(PNGやJPEG)での出力も可能です。
【公式サイト】:http://www.jfree.org/jfreechart/
(図211)JFreeChartで作成したチャートの例

■備考
・チャートの描画にはJava 2DのAPIが利用されます
・Java FXもサポートされていますが、JDK 1.8.0以上の環境が必要
・依存ライブラリであるJCommon等についてはJFreeChartの配布資源に含まれています(※jcommon-1.0.23.jarなど)
・別途ソースコード本体が必要な場合は専用サイトからダウンロードします。
http://www.jfree.org/jcommon/
(2-2) JFreeChartのアーキテクチャについて
(2-2-1) クラス粒度のアーキテクチャについて
JFreeChartの処理の流れは大きく分けて3つのステップで構成されます。
①データセットの作成
(表の元となるデータの作成)
↓
②チャートの作成
(棒グラフや円グラフ等の生成)
↓
③出力処理
(Swingフレームへの描画やPNG画像での出力等)
そして各ステップ毎に専用のクラスを使い、それらを組み合わせていく事でチャートの描画を実現していきます。
(図212)JFreeChartのクラス粒度の構造

(表)各ノードの説明
| 処理 | 処理結果 (アウトプット) |
概要 |
| Create Dataset (データセット生成) |
- | データセット(グラフに描画する値の集まり)を作成する工程です |
| - | General Dataset | 円グラフ用(PieChart)です。 —————————— (例)DefaultPieDatasetクラス |
| - | Category Dataset | 折れ線グラフ(LineChart)/棒グラフ用(BarChart)です。 —————————— (例)DefaultCategoryDatasetクラス |
| - | Series Dataset | 同一カテゴリのデータを纏める単位です。例えば米国の折れ線データの点群を一つのカテゴリに入れて、日本の折れ線データの点群は別のカテゴリに入れます。 —————————— (例)XYSeriesクラス |
| - | Series Collection Dataset | 異なるカテゴリの「Series Dataset」を一纏めにしたのが「Series Collection Dataset」です。主にXY折れ線グラフ用(XY LineChart)用です。 —————————— (例)XYSeriesCollectionDatasetクラス |
| Create Chart (チャート生成) |
- | データセットを用いて実際にチャートを生成する処理です。 —————————— (例)ChartFactoryクラス-createLineChartメソッド (例)ChartFactoryクラス-createXYLineChartメソッド |
| Frame / Image (出力処理) |
- | アウトプット(生成したチャート)はSwingのフレーム(Jframeクラス)か画像(PNG/JPEG)として出力されます。 —————————— (例)ChartFrameクラス (例)ChartUtilitiesクラス-writeChartAsPNGメソッド |
(3) JFreeChartの導入手順
(3-1) ライブラリのダウンロード
下記のダウンロードサイトより資源をダウロード&解凍します。
https://sourceforge.net/projects/jfreechart/files/
(図312)ダウンロードサイト

(図313)ダウンロード押下

(3-2) ライブラリの配置
①jcommon-X.X.X.jar
→(例)jfreechart-1.0.19\lib\jfreechart-1.0.19.jar
②jfreechart-X.X.X.jar
→(例)jfreechart-1.0.19\lib\jcommon-1.0.23.jar
(図314)必要なjar

(図315)TeraTermを使ってLinuxサーバに配備する例
※一度tempディレクトリに送ってからcpコマンドで正規の場所に配置しています。



(3-3) ビルドパスの設定
以下の手順で配置した2つのjarファイルに対してビルドパスの設定を行います。
①チャート描画を行うプロジェクトを右クリックして「BuildPath」→「Configure Build Path」と選択します。
(図316)

②プロパティ画面が開いたら「Libraries」タブを開いて「Add External Jars」を選択します。
(図317)

③先ほど追加したjarファイルを選択します。
(図318)

④追加された事が確認できたら「Apply and Close」を押下します。
(図319)

以上で事前の準備は完了です。
(4) サンプルプログラム
(4-1) 円グラフサンプル(PieChart)
円グラフのサンプルプログラムです。
package jfreechart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
public class JFreeChartSampePieChart {
public static void main(String args[]) {
//(1)データセットの作成
DefaultPieDataset ds_pie = new DefaultPieDataset();
ds_pie.setValue("みかん",12);
ds_pie.setValue("バナナ",18);
ds_pie.setValue("りんご",20);
ds_pie.setValue("ぶどう",27);
ds_pie.setValue("オレンジ",23);
//(2)チャートの作成
JFreeChart chart=ChartFactory.createPieChart3D("好きなフルーツは?", ds_pie,true,false,false);
//(3)出力処理
ChartFrame frame1 = new ChartFrame("Rainbow Planet Sample Chart(^o^)", chart);
frame1.setVisible(true);
frame1.setSize(600,400);
}
}
(図411)実行結果


(4-2) 折れ線グラフサンプル(LineChart)
折れ線グラフのサンプルプログラムです。
package jfreechart;
import java.awt.BasicStroke;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public class JFreeChartSampeCategoryChart {
public static void main(String args[]) {
//(1)データセットの作成
DefaultCategoryDataset ds_cat = new DefaultCategoryDataset();
ds_cat.setValue(120,"チョコ","3月");
ds_cat.setValue(130,"チョコ","4月");
ds_cat.setValue(140,"チョコ","5月");
ds_cat.setValue(150,"クッキー","3月");
ds_cat.setValue(120,"クッキー","4月");
ds_cat.setValue(130,"クッキー","5月");
ds_cat.setValue(250,"グミ","3月");
ds_cat.setValue(190,"グミ","4月");
ds_cat.setValue(210,"グミ","5月");
//(2)チャートの作成
JFreeChart chart=ChartFactory.createLineChart("お菓子の売上数", "月", "売れた数", ds_cat, PlotOrientation.VERTICAL, true, false, false);
chart.getCategoryPlot().getRenderer().setSeriesStroke(0, new BasicStroke(4));
chart.getCategoryPlot().getRenderer().setSeriesStroke(1, new BasicStroke(4));
chart.getCategoryPlot().getRenderer().setSeriesStroke(2, new BasicStroke(4));
//(3)出力処理
ChartFrame frame1 = new ChartFrame("Rainbow Planet Sample Chart(^o^)", chart);
frame1.setVisible(true);
frame1.setSize(800,400);
}
}
(図413)実行結果


(4-3) XY折れ線グラフサンプル(XYLineChart)
XY折れ線グラフのサンプルプログラムです。
package jfreechart;
import java.awt.BasicStroke;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class JFreeChartSampeXYLineChart {
public static void main(String args[]) {
//(1)データセットの作成
XYSeries xy1 = new XYSeries("あああ商店");
xy1.add(1,150);
xy1.add(2,160);
xy1.add(3,180);
XYSeries xy2 = new XYSeries("いいい書店");
xy2.add(1,200);
xy2.add(2,180);
xy2.add(3,220);
XYSeriesCollection ds_xy = new XYSeriesCollection();
ds_xy.addSeries(xy1);
ds_xy.addSeries(xy2);
//(2)チャートの作成
JFreeChart chart=ChartFactory.createXYLineChart("商店街売上", "日", "来店数", ds_xy, PlotOrientation.VERTICAL, true, false, false);
chart.getXYPlot().getRenderer().setSeriesStroke(0, new BasicStroke(4));
chart.getXYPlot().getRenderer().setSeriesStroke(1, new BasicStroke(4));
//(3)出力処理
ChartFrame frame1 = new ChartFrame("Rainbow Planet Sample Chart(^o^)", chart);
frame1.setVisible(true);
frame1.setSize(600,400);
}
}
(図414)

