こんにちは。「Javaを復習する初心者」です。度数分布図についてコンソールで描画、swingで描画してきましたが、今回はJavaのライブラリJFreeChartを使って描画しました。
JFreeChartの使い方
JFreeChartの使い方の流れは以下になります。
- 日本語文字化け対策のため、以下を記述。
「ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());」 - DefaultCategoryDataset型変数を宣言し、新規インスタンスを格納する。
- DefaultCategoryDataset#setValueメソッドでデータを追加する。
- JFreeChart型変数を宣言し、ChartFactory.createBarChartメソッドで取得したインスタンスを格納する。
- ChartPanel型変数を宣言し、コンストラクタChartPanel(JFreeChart chart)でインスタンスを生成して格納する。
- JFrameに追加する。
JFreeChartの詳細
それぞれの詳細を少し書きます。
ChartFactory.setChartThemeクラスでStandardChartTheme.createLegacyTheme()を指定しています。これを記述しないと日本語表示が□になってしまいました。ネットで情報を調べた結果、この一行が必要だとわかりました。デフォルトのJFreeChartから何も変更を加えてないChartThemeを指定するということらしいです。
DefaultCategoryDatasetクラスはCategoryDataset interfaceのデフォルトの実装らしいです。よくわかりませんでした。setValueメソッドを持っていて、引数が「double value, java.lang.Comparable rowKey, java.lang.Comparable columnKey」のものを使いました。2番目の引数は系列を表します。今回は空文字を指定しました。異なる系列をするとグラフがその分、複数になるようです。
JFreeChartクラスはJava 2D APIsを使用して実装されているようです。ChartFactoryクラスに読み取り専用チャートのメソッドが用意されています。createBarChartメソッドで棒グラフが生成できます。JFreeChartのAPIドキュメントを見ると、引数は以下のようです。
- java.lang.String title
- グラフのタイトルです。nullを指定すると何も表示されません。
- java.lang.String categoryAxisLabel
- 区分の軸(X軸)のラベルです。nullを指定すると何も表示されません。
- java.lang.String valueAxisLabel
- 値の軸(Y軸)のラベルです。nullを指定すると何も表示されません。
- CategoryDataset dataset
- DefaultCategoryDatasetのインスタンスを指定します。nullを指定することが可能です。
- PlotOrientation orientation
- 横のグラフの場合、PlotOrientation.HORIZONTALを指定します。縦のグラフの場合、PlotOrientation.VERTICALを指定します。
- boolean legend
- trueにするとグラフの下に系列が表示されます。
- boolean tooltips
- trueにするとグラフにマウスカーソルを重ねるとツールチップが表示されます。
- boolean urls
- よくわかりませんでした。
ソースと実行結果
以下はソースと実行結果です。
ソースコード
package practice;
import java.awt.BorderLayout;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public class Hello20160804 {
// 項目ラベル
private static final String[] labels = {
" 0~ 9点",
"10~19点",
"20~29点",
"30~39点",
"40~49点",
"50~59点",
"60~69点",
"70~79点",
"80~89点",
"90~99点",
" 100点",
};
public static void main(String[] args) {
// 点数をランダムで格納
int[] points = new int[1000];
Random random = new Random();
for (int i = 0; i < points.length; i++) {
points[i] = random.nextInt(101);
}
// 集計
int[] counts = new int[11];
for (int point : points) {
counts[ point / 10 ] ++;
}
// グラフ生成
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
DefaultCategoryDataset data = new DefaultCategoryDataset();
for (int i = 0; i < labels.length; i++) {
data.setValue(counts[i], "", labels[i]);
}
JFreeChart chart = ChartFactory.createBarChart(
"点数グラフ",
"点数",
"人数",
data,
PlotOrientation.HORIZONTAL,
false,
false,
false
);
ChartPanel cpanel = new ChartPanel(chart);
// フレーム表示
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setTitle("点数グラフ表示");
frame.add(cpanel, BorderLayout.CENTER);
frame.setVisible(true);
}
}
値の範囲は自動調整してくれるようです。また、初期設定ではグラフに影がつくようです。