|
|
JFreeChart を使ったグラフ作成 折れ線グラフ(LineChart, LineChat3D) |
H.Kamifuji . |
棒グラフの作成に関して確認します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 に、アップされています。JDK-23 + jfreechart-1.0.19 で、上位互換について、見直しを行っていきます。 |
|
折れ線グラフの基本的な作成方法を確認します。 まずChartFactoryクラスの「createLineChart」メソッドを使って折れ線グラフを扱うJFreeChartクラスのオブジェクトを作成します。 createLineChart public static JFreeChart createLineChart(java.lang.String title, java.lang.String categoryAxisLabel, java.lang.String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)Creates a line chart with default settings. The chart object returned by this method uses a CategoryPlot instance as the plot, with a CategoryAxis for the domain axis, a NumberAxis as the range axis, and a LineAndShapeRenderer as the renderer. Parameters: title - the chart title (null permitted). categoryAxisLabel - the label for the category axis (null permitted). valueAxisLabel - the label for the value axis (null permitted). dataset - the dataset for the chart (null permitted). orientation - the chart orientation (horizontal or vertical) (null not permitted). legend - a flag specifying whether or not a legend is required. tooltips - configure chart to generate tool tips? urls - configure chart to generate URLs? Returns: A line chart. 1番目の引数にグラフのタイトルを文字列で指定します。 2番目の引数には項目が配置される軸のラベルを文字列で指定します。3番目の引数には値が配置される軸のラベルを文字列で指定します。 4番目の引数にはグラフのデータをCategoryDatasetインターフェースを実装したクラスのオブジェクトで指定します。今回はDefaultCategoryDatasetクラスを使います。詳細は次のページで確認します。 5番目の引数には折れ線グラフの向きを指定します。指定可能な値はorg.jfree.chart.plot.PlotOrientationクラスで定義されており、次のどちらかとなります。 PlotOrientation.VERTICAL 値を表す軸がY軸 PlotOrientation.HORIZONTAL 値を表す軸がX軸6番目の引数には凡例を表示するかどうかを「true」か「false」で指定します。 7番目の引数にはツールチップを作成するかどうかを「true」か「false」で指定します。 8番目の引数にはURLを作成するかどうかを「true」か「false」で指定します。 実際の使い方は次のようになります。 DefaultCategoryDataset data = new DefaultCategoryDataset(); JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", data, PlotOrientation.VERTICAL, true, false, false);実際のデータの追加方法は次のページで確認します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 折れ線グラフの作成(createLineChartメソッド) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; public class Test1_1 extends JFrame{ public static void main(String[] args) { Test1_1 frame = new Test1_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test1_1(){ DefaultCategoryDataset data = new DefaultCategoryDataset(); JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", data, PlotOrientation.VERTICAL, true, false, false); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 現状ではグラフのデータが含まれていませんので凡例なども表示されていません。 |
折れ線グラフのデータはDefaultCategoryDatasetクラスを使います。 DefaultCategoryDatasetクラスについては棒グラフの場合と同じですので詳しくは「棒グラフのデータ(DefaultCategoryDataset)」を参照して下さい。 実際には次のように記述します。 DefaultCategoryDataset data = new DefaultCategoryDataset(); データの登録オブジェクトを作成したらデータを登録していきます。DefaultCategoryDatasetクラスで用意されている「addValue」メソッドを使います。addValue public void addValue(java.lang.Number value, java.lang.Comparable rowKey, java.lang.Comparable columnKey)Adds a value to the table. Performs the same function as setValue(). Parameters: value - the value. rowKey - the row key. columnKey - the column key. 線グラフではデータ毎に値、系列、項目をセットにして1つのデータを登録します。「addValue」メソッドでは1番目の引数に値、2番目の引数に系列名、3番目の引数に項目名を指定します。 ここでは例として次のようなデータを元にグラフを作成します。(値は適当です)。
今回は系列が1つですので、実際には次のようになります。 DefaultCategoryDataset data = new DefaultCategoryDataset(); data.addValue(300, "米国", "2005年"); data.addValue(500, "米国", "2006年"); data.addValue(120, "米国", "2007年");複数の系列については次のページで確認します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 折れ線グラフのデータ(DefaultCategoryDataset) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; public class Test2_1 extends JFrame{ public static void main(String[] args) { Test2_1 frame = new Test2_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test2_1(){ DefaultCategoryDataset data = new DefaultCategoryDataset(); data.addValue(300, "米国", "2005年"); data.addValue(500, "米国", "2006年"); data.addValue(120, "米国", "2007年"); JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", data, PlotOrientation.VERTICAL, true, false, false); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
折れ線グラフの場合は複数の系列のデータを一度に表示することが可能です。 ここでは例として次のようなデータを元にグラフを作成します。
複数の系列の場合も手順は同じです。データの数だけ「addValue」メソッドを実行します。「addValue」メソッドの引数は次の通りとなっていました。 addValue(値, 系列, 項目)先ほどのデータであれば次のように記述します。 DefaultCategoryDataset data = new DefaultCategoryDataset(); String[] series = {"米国", "中国", "インド"}; String[] category = {"2005年", "2006年", "2007年"}; data.addValue(300, series[0], category[0]); data.addValue(500, series[0], category[1]); data.addValue(400, series[0], category[2]); data.addValue(200, series[1], category[0]); data.addValue(600, series[1], category[1]); data.addValue(200, series[1], category[2]); data.addValue(100, series[2], category[0]); data.addValue(150, series[2], category[1]); data.addValue(700, series[2], category[2]);では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 複数の系列のデータ */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; public class Test3_1 extends JFrame{ public static void main(String[] args) { Test3_1 frame = new Test3_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test3_1(){ DefaultCategoryDataset data = new DefaultCategoryDataset(); String[] series = {"米国", "中国", "インド"}; String[] category = {"2005年", "2006年", "2007年"}; data.addValue(300, series[0], category[0]); data.addValue(500, series[0], category[1]); data.addValue(400, series[0], category[2]); data.addValue(200, series[1], category[0]); data.addValue(600, series[1], category[1]); data.addValue(200, series[1], category[2]); data.addValue(100, series[2], category[0]); data.addValue(150, series[2], category[1]); data.addValue(700, series[2], category[2]); JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", data, PlotOrientation.VERTICAL, true, false, false); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
折れ線グラフではグラフの向きとして値を表す軸をY軸とX軸で選択することが可能です。どちらを使用するかは「createAreaChart」メソッドの5番目の引数で指定します。 垂直方向であれば「PlotOrientation.VERTICAL」を指定します。例えば次のように記述します。 DefaultCategoryDataset data = new DefaultCategoryDataset(); JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", data, PlotOrientation.VERTICAL, true, false, false);水平方向であれば「PlotOrientation.HORIZONTAL」を指定します。例えば次のように記述します。 DefaultCategoryDataset data = new DefaultCategoryDataset(); JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", data, PlotOrientation.HORIZONTAL, true, false, false);この時、あくまで折れ線グラフの各頂点が表すのは値として設定したデータです。その為、折れ線グラフの向きを変えたからといって折れ線グラフの頂点が表現する対象は値のままです。また各軸に表示されるラベルもX軸やY軸といった指定ではなく、「項目が配置される軸に対するラベル」のような指定方法ですので、折れ線グラフの向きに合わせてその他の設定を変更する必要はありません。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * グラフの向きを変更 */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; public class Test4_1 extends JFrame{ public static void main(String[] args) { Test4_1 frame = new Test4_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test4_1(){ DefaultCategoryDataset data = new DefaultCategoryDataset(); String[] series = {"米国", "中国", "インド"}; String[] category = {"2005年", "2006年", "2007年"}; data.addValue(300, series[0], category[0]); data.addValue(500, series[0], category[1]); data.addValue(400, series[0], category[2]); data.addValue(200, series[1], category[0]); data.addValue(600, series[1], category[1]); data.addValue(200, series[1], category[2]); data.addValue(100, series[2], category[0]); data.addValue(150, series[2], category[1]); data.addValue(700, series[2], category[2]); JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", data, PlotOrientation.HORIZONTAL, true, false, false); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
折れ線グラフでは線を立体にした3D折れ線グラフを作成することも可能です。 まずChartFactoryクラスの「createLineChart3D」メソッドを使って折れ線グラフを扱うJFreeChartクラスのオブジェクトを作成します。 createLineChart3D public static JFreeChart createLineChart3D(java.lang.String title, java.lang.String categoryAxisLabel, java.lang.String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)Creates a line chart with default settings. The chart object returned by this method uses a CategoryPlot instance as the plot, with a CategoryAxis3D for the domain axis, a NumberAxis3D as the range axis, and a LineRenderer3D as the renderer. Parameters: title - the chart title (null permitted). categoryAxisLabel - the label for the category axis (null permitted). valueAxisLabel - the label for the value axis (null permitted). dataset - the dataset for the chart (null permitted). orientation - the chart orientation (horizontal or vertical) (null not permitted). legend - a flag specifying whether or not a legend is required. tooltips - configure chart to generate tool tips? urls - configure chart to generate URLs? Returns: A line chart. 1番目の引数にグラフのタイトルを文字列で指定します。 2番目の引数には項目が配置される軸のラベルを文字列で指定します。3番目の引数には値が配置される軸のラベルを文字列で指定します。 4番目の引数にはグラフのデータをCategoryDatasetインターフェースを実装したクラスのオブジェクトで指定します。今回はDefaultCategoryDatasetクラスを使います。詳細は次のページで確認します。 5番目の引数にはo折れ線グラフの向きを指定します。指定可能な値はorg.jfree.chart.plot.PlotOrientationクラスで定義されており、次のどちらかとなります。 PlotOrientation.HORIZONTAL PlotOrientation.VERTICAL6番目の引数には凡例を表示するかどうかを「true」か「false」で指定します。 7番目の引数にはツールチップを作成するかどうかを「true」か「false」で指定します。 8番目の引数にはURLを作成するかどうかを「true」か「false」で指定します。 実際の使い方は次のようになります。 DefaultCategoryDataset data = new DefaultCategoryDataset(); JFreeChart chart = ChartFactory.createLineChart3S("輸入量", "年度", "トン(t)", data, PlotOrientation.VERTICAL, true, false, false); データの登録データの登録は折れ線グラフの場合と同じくDefaultCategoryDatasetクラスを使用します。
実際には次のように記述します。 DefaultCategoryDataset data = new DefaultCategoryDataset(); String[] series = {"米国", "中国", "インド"}; String[] category = {"2005年", "2006年", "2007年"}; data.addValue(300, series[0], category[0]); data.addValue(500, series[0], category[1]); data.addValue(400, series[0], category[2]); data.addValue(200, series[1], category[0]); data.addValue(600, series[1], category[1]); data.addValue(200, series[1], category[2]); data.addValue(100, series[2], category[0]); data.addValue(150, series[2], category[1]); data.addValue(700, series[2], category[2]);データの作成は折れ線グラフの場合と同じです。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 3D折れ線グラフの作成(createLineChart3Dメソッド) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; public class Test5_1 extends JFrame{ public static void main(String[] args) { Test5_1 frame = new Test5_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test5_1(){ DefaultCategoryDataset data = new DefaultCategoryDataset(); String[] series = {"米国", "中国", "インド"}; String[] category = {"2005年", "2006年", "2007年"}; data.addValue(300, series[0], category[0]); data.addValue(500, series[0], category[1]); data.addValue(400, series[0], category[2]); data.addValue(200, series[1], category[0]); data.addValue(600, series[1], category[1]); data.addValue(200, series[1], category[2]); data.addValue(100, series[2], category[0]); data.addValue(150, series[2], category[1]); data.addValue(700, series[2], category[2]); JFreeChart chart = ChartFactory.createLineChart3D("輸入量", "年度", "トン(t)", data, PlotOrientation.VERTICAL, true, false, false); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() もう一つサンプルを試します。今度はグラフの向きを変えてみます。 サンプルプログラム下記のサンプルを実行してみよう。import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; public class Test5_2 extends JFrame{ public static void main(String[] args) { Test5_2 frame = new Test5_2(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test5_2(){ DefaultCategoryDataset data = new DefaultCategoryDataset(); String[] series = {"米国", "中国", "インド"}; String[] category = {"2005年", "2006年", "2007年"}; data.addValue(300, series[0], category[0]); data.addValue(500, series[0], category[1]); data.addValue(400, series[0], category[2]); data.addValue(200, series[1], category[0]); data.addValue(600, series[1], category[1]); data.addValue(200, series[1], category[2]); data.addValue(100, series[2], category[0]); data.addValue(150, series[2], category[1]); data.addValue(700, series[2], category[2]); JFreeChart chart = ChartFactory.createLineChart3D("輸入量", "年度", "トン(t)", data, PlotOrientation.HORIZONTAL, true, false, false); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
グラフの描画領域を取得し、描画領域に対する設定を行っていきます。ファクトリメソッドを使ってJFreeChartクラスのオブジェクトを作成した場合は、JFreeChartクラスで用意されている「getPlot」メソッドを使ってPlotクラスのオブジェクトを取得します。 折れ線グラフの場合には、取得したPlotクラスのオブジェクトを、PlotクラスのサブクラスであるCategoryPlotクラスにキャストして取得して使います。棒グラフの場合と同じですので、詳しくは「棒グラフの描画領域(CategoryPlotクラス)」を参照して下さい。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createLineChart(...); /* 引数は省略 */ CategoryPlot plot = (CategoryPlot)chart.getPlot();または次のように記述しても結構です。 JFreeChart chart = ChartFactory.createLineChart(...); /* 引数は省略 */ CategoryPlot plot = chart.getCategoryPlot();では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 折れ線グラフの描画領域(CategoryPlotクラス) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.plot.PlotOrientation; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.plot.CategoryPlot; import java.awt.Color; public class Test6_1 extends JFrame{ public static void main(String[] args) { Test6_1 frame = new Test6_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test6_1(){ JFreeChart chart = ChartFactory.createLineChart("輸入量", "年度", "トン(t)", createData(), PlotOrientation.VERTICAL, true, false, false); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.ORANGE); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultCategoryDataset createData(){ DefaultCategoryDataset data = new DefaultCategoryDataset(); String[] series = {"米国", "中国", "インド"}; String[] category = {"2005年", "2006年", "2007年"}; data.addValue(300, series[0], category[0]); data.addValue(500, series[0], category[1]); data.addValue(400, series[0], category[2]); data.addValue(200, series[1], category[0]); data.addValue(600, series[1], category[1]); data.addValue(200, series[1], category[2]); data.addValue(100, series[2], category[0]); data.addValue(150, series[2], category[1]); data.addValue(700, series[2], category[2]); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回は例として描画領域の背景色をオレンジに変更しました。また上記のオレンジの箇所がグラフの描画領域となります。 |
|