JFreeChart – 棒グラフに折れ線グラフを追加するには


棒グラフに折れ線グラフを追加するには、下記のような手順で行います。

1. ベースとなる棒グラフを作成します。

2. 追加する折れ線グラフのデータを、CategoryPlotクラスのsetDatasetメソッドを使用して追加します。

3. 追加する折れ線グラフの軸を、CategoryPlotクラスのsetRangeAxisメソッドを使用して設定します。

4. 追加する折れ線グラフの表示方法を、CategoryPlotクラスのsetRendererメソッド、setDatasetRenderingOrderメソッドを使用して設定します。

package net.tk_factory.example.jfreechart;

import java.io.FileOutputStream;
import java.io.IOException;

import net.tk_factory.example.AbstractExample;

import org.apache.log4j.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 * JFreeChartを使用したサンプルプログラムです。<br/>
 * <br/>
 * <b>内容</b>
 * <ol type="1">
 * <li>棒グラフに折れ線グラフを追加します。</li>
 * </ol>
 *
 * @author Takafumi Kondo (TK Factory)
 */
public class ExampleCreateBarAndLineChart extends AbstractExample
{
    /** クラス名 */
    private static final String CLASS_NAME =
            ExampleCreateBarAndLineChart.class.getSimpleName();

    /** ロガー */
    private static final Logger LOGGER =
            Logger.getLogger(ExampleCreateBarAndLineChart.class.getName());

    /** 出力ファイル名(PNG形式) */
    private static final String OUT_FILE_NAME_PNG =
            EXAMPLE_FILE_DIRECTORY +  CLASS_NAME + ".png";

    /**
     * ExampleCreateBarAndLineChartオブジェクトを構築すると、
     * UnsupportedOperationExceptionがスローされます。<br/>
     */
    protected ExampleCreateBarAndLineChart()
    {
        throw new UnsupportedOperationException();
    }

    /**
     * mainメソッドです。<br/>
     *
     * @param args 引数
     */
    public static void main(String[] args)
    {
        LOGGER.info("[START]" + CLASS_NAME);

        FileOutputStream png = null;

        try
        {
            //すでに出力ファイルが存在している場合は削除する
            deleteExistsFile(OUT_FILE_NAME_PNG);

            //レガシーテーマを設定する
            ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

            //棒グラフのデータを設定する
            DefaultCategoryDataset barDataset = new DefaultCategoryDataset();
            //全体
            barDataset.addValue(14.3, "支持する", "全体");
            barDataset.addValue(70.1, "どちらでもない", "全体");
            barDataset.addValue(15.6, "支持しない", "全体");
            //20代
            barDataset.addValue(10.7, "支持する", "20代");
            barDataset.addValue(68.0, "どちらでもない", "20代");
            barDataset.addValue(21.3, "支持しない", "20代");
            //30代
            barDataset.addValue(11.6, "支持する", "30代");
            barDataset.addValue(69.7, "どちらでもない", "30代");
            barDataset.addValue(18.7, "支持しない", "30代");
            //40代
            barDataset.addValue(15.1, "支持する", "40代");
            barDataset.addValue(71.7, "どちらでもない", "40代");
            barDataset.addValue(13.2, "支持しない", "40代");
            //50代
            barDataset.addValue(14.6, "支持する", "50代");
            barDataset.addValue(72.4, "どちらでもない", "50代");
            barDataset.addValue(13.0, "支持しない", "50代");
            //60代以上
            barDataset.addValue(24.6, "支持する", "60代以上");
            barDataset.addValue(68.5, "どちらでもない", "60代以上");
            barDataset.addValue(6.9, "支持しない", "60代以上");

            //棒グラフを生成する
            JFreeChart chart = ChartFactory.createBarChart(
                    //・グラフタイトル
                    "内閣支持率",
                    //・カテゴリ軸ラベル
                    "年代",
                    //・値軸ラベル
                    "支持率",
                    //・データセット
                    barDataset,
                    //・グラフの出力方向
                    PlotOrientation.VERTICAL,
                    //・凡例の表示有無
                    true,
                    //・ツールチップの表示有無
                    false,
                    //・URL動的生成の有無
                    false);

            //追加する折れ線グラフのデータを設定する
            DefaultCategoryDataset lineDataset = new DefaultCategoryDataset();
            //全体
            lineDataset.addValue(68.8, "投票率", "全体");
            //20代
            lineDataset.addValue(46.1, "投票率", "20代");
            //30代
            lineDataset.addValue(59.9, "投票率", "30代");
            //40代
            lineDataset.addValue(71.9, "投票率", "40代");
            //50代
            lineDataset.addValue(77.7, "投票率", "50代");
            //60代以上
            lineDataset.addValue(75.1, "投票率", "60代以上");

            //追加する折れ線グラフのデータを追加する
            CategoryPlot plot = chart.getCategoryPlot();
            plot.setDataset(1, lineDataset);
            plot.mapDatasetToRangeAxis(1, 1);

            //追加する折れ線グラフの軸を設定する
            ValueAxis axis = new NumberAxis("投票率");
            plot.setRangeAxis(1, axis);

            //追加する折れ線グラフの表示方法を設定する
            LineAndShapeRenderer renderer = new LineAndShapeRenderer();
            plot.setRenderer(1, renderer);
            plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

            //PNG形式でファイルへ保存する
            png = new FileOutputStream(OUT_FILE_NAME_PNG);
            ChartUtilities.writeChartAsPNG(png, chart, 600, 400);
        }
        catch (IOException ioex)
        {
            LOGGER.error(getStackTrace(ioex));
        }
        finally
        {
            try
            {
                if (png != null)
                {
                    png.close();
                }
            }
            catch (IOException ioex)
            {
                LOGGER.error(getStackTrace(ioex));
            }

            LOGGER.info("[E N D]" + CLASS_NAME);
        }
    }
}

作成されるファイルはこんな感じです。
ExampleCreateBarAndLineChart

関連記事

    • グラハム
    • 2011 10/31 2:06pm

    もうすでに書いてあるのに何故という質問になってしまったら申し訳ありません。
    その場合は、私の様なサルにでもわかるように教えてくださると嬉しいです。
    このグラフですが、投票率、支持率共に目盛がありますが、値が違いますよね?

    どうすれば一緒になるのでしょうか?
    間隔が同じというのも素晴らしく思いますが、私自身が作ったものですと、まったくと言っていいほど間隔が違います。
    どうすればいいのでしょうか?

    是非、説明お願い致します。

  1. ソースを見直し、一部、修正しました。

  1. トラックバック 0

return top