こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

度数分布図をJFreeChartで描画

こんにちは。「Javaを復習する初心者」です。度数分布図についてコンソールで描画、swingで描画してきましたが、今回はJavaのライブラリJFreeChartを使って描画しました。

JFreeChartの使い方の流れは以下になります。

JFreeChartの詳細

  1. 日本語文字化け対策のため、以下を記述。
    「ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());」

  2. DefaultCategoryDataset型変数を宣言し、新規インスタンスを格納する。
  3. DefaultCategoryDataset#setValueメソッドでデータを追加する。
  4. JFreeChart型変数を宣言し、ChartFactory.createBarChartメソッドで取得したインスタンスを格納する。
  5. ChartPanel型変数を宣言し、コンストラクタChartPanel(JFreeChart chart)でインスタンスを生成して格納する。
  6. JFrameに追加する。

それぞれの詳細を少し書きます。

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);

    }

}

JFreeChart-graph

値の範囲は自動調整してくれるようです。また、初期設定ではグラフに影がつくようです。