|
|
JFreeChart を使ったグラフ作成 エリアグラフ(AreaChart) |
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クラスの「createAreaChart」メソッドを使ってエリアグラフを扱うJFreeChartクラスのオブジェクトを作成します。 createAreaChart public static JFreeChart createAreaChart(java.lang.String title, java.lang.String categoryAxisLabel, java.lang.String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)Creates an area 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 an AreaRenderer 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 plot orientation (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: An area 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.createAreaChart("ビールシェア", "年度", "シェア", data, PlotOrientation.VERTICAL, true, false, false);実際のデータの追加方法は次項のページで確認します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * エリアグラフの作成(createAreaChartメソッド) */ 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.createAreaChart("ビールシェア", "年度", "シェア", 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. グラフに表示したいデータ毎に値/系列/項目の3つについて引数に指定していきます。1番目の引数に値、2番目の引数に系列名、3番目の引数に項目名を指定します。 ここでは例として次のようなデータを元にグラフを作成します。(値は適当です)。
今回は系列が1つですので、実際には次のようになります。 DefaultCategoryDataset data = new DefaultCategoryDataset(); data.addValue(44, "キリン", "1998年"); data.addValue(42, "キリン", "1999年"); data.addValue(41, "キリン", "2000年");複数の系列については次のページで確認します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * エリアグラフのデータ(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(44, "キリン", "1998年"); data.addValue(42, "キリン", "1999年"); data.addValue(41, "キリン", "2000年"); JFreeChart chart = ChartFactory.createAreaChart("ビールシェア", "年度", "シェア", 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 = {"1998年", "1999年", "2000年"}; data.addValue(44, series[0], category[0]); data.addValue(42, series[0], category[1]); data.addValue(41, series[0], category[2]); data.addValue(30, series[1], category[0]); data.addValue(35, series[1], category[1]); data.addValue(39, series[1], category[2]); data.addValue(20, series[2], category[0]); data.addValue(18, series[2], category[1]); data.addValue(12, series[2], category[2]); data.addValue(10, series[3], category[0]); data.addValue(18, series[3], category[1]); data.addValue(26, series[3], 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 = {"1998年", "1999年", "2000年"}; data.addValue(44, series[0], category[0]); data.addValue(42, series[0], category[1]); data.addValue(41, series[0], category[2]); data.addValue(30, series[1], category[0]); data.addValue(35, series[1], category[1]); data.addValue(39, series[1], category[2]); data.addValue(20, series[2], category[0]); data.addValue(18, series[2], category[1]); data.addValue(12, series[2], category[2]); data.addValue(10, series[3], category[0]); data.addValue(18, series[3], category[1]); data.addValue(26, series[3], category[2]); JFreeChart chart = ChartFactory.createAreaChart("ビールシェア", "年度", "シェア", 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("ビールシェア", "年度", "シェア", data, PlotOrientation.VERTICAL, true, false, false);水平方向であれば「PlotOrientation.HORIZONTAL」を指定します。例えば次のように記述します。 DefaultCategoryDataset data = new DefaultCategoryDataset(); JFreeChart chart = ChartFactory.createLineChart("ビールシェア", "年度", "シェア", 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 = {"1998年", "1999年", "2000年"}; data.addValue(44, series[0], category[0]); data.addValue(42, series[0], category[1]); data.addValue(41, series[0], category[2]); data.addValue(30, series[1], category[0]); data.addValue(35, series[1], category[1]); data.addValue(39, series[1], category[2]); data.addValue(20, series[2], category[0]); data.addValue(18, series[2], category[1]); data.addValue(12, series[2], category[2]); data.addValue(10, series[3], category[0]); data.addValue(18, series[3], category[1]); data.addValue(26, series[3], category[2]); JFreeChart chart = ChartFactory.createAreaChart("ビールシェア", "年度", "シェア", 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.createAreaChart(...); /* 引数は省略 */ CategoryPlot plot = (CategoryPlot)chart.getPlot();または次のように記述しても結構です。 JFreeChart chart = ChartFactory.createAreaChart(...); /* 引数は省略 */ 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 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(){ JFreeChart chart = ChartFactory.createAreaChart("ビールシェア", "年度", "シェア", 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 = {"1998年", "1999年", "2000年"}; data.addValue(44, series[0], category[0]); data.addValue(42, series[0], category[1]); data.addValue(41, series[0], category[2]); data.addValue(30, series[1], category[0]); data.addValue(35, series[1], category[1]); data.addValue(39, series[1], category[2]); data.addValue(20, series[2], category[0]); data.addValue(18, series[2], category[1]); data.addValue(12, series[2], category[2]); data.addValue(10, series[3], category[0]); data.addValue(18, series[3], category[1]); data.addValue(26, series[3], category[2]); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回は例として描画領域の背景色をオレンジに変更しました。また上記のオレンジの箇所がグラフの描画領域となります。 |
|