生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

JFreeChartで、個々の折れ線グラフの色と線の太さを変える

前回書いた折れ線グラフを上書きするプログラムに、個々の折れ線グラフの色と線の太さを変えるプログラムを書く。かなり強引で最もキレイな書き方が多分あるはず。

とりあえず、プログラムの全体を下記に示す。

package testProgram;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.jfree.chart.ChartColor;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class PlotOver extends JFrame implements ActionListener {

	XYLineAndShapeRenderer render;
	Random rand = new Random();

	JFrame frame2;
	XYSeriesCollection trace;
	ChartPanel cpane;
	int no = 30;

	//データを入れる配列
	int data [] = new int [no];
	int data1 []  = new int [no];
	int data2 [] = new int [no];

	//データの作成
	public void makeData (int [] data) {
		for (int i = 0; i < no; i++) {
			data [i] = rand.nextInt(100) + 1;
		}
	}

	//Seriesへのadd
	public void seriesAdd (XYSeries a, int [] data) {
		for (int i = 0; i < no; i++) {
		a.add(i, data[i]);
		}
	}

	//最初の折れ線グラフを描く
	public void MakeFig () {
		makeData(data);
		frame2 = new JFrame ("ShowData");
		frame2.setSize(500, 500);
		frame2.setLocationRelativeTo(null);
		frame2.setVisible (true);

		trace = new XYSeriesCollection ();
		XYSeries series = new XYSeries("Test");

		seriesAdd(series, data);
		trace.addSeries(series);

		JFreeChart chart = ChartFactory.createXYLineChart (
				"Data",
				"Frame",
				"Value",
				trace,
				PlotOrientation.VERTICAL,
				true,
				false,
				false);

		XYPlot linePlot = chart.getXYPlot();

		render = new XYLineAndShapeRenderer();
		linePlot.setRenderer(0, render);
		render.setSeriesPaint (0, ChartColor.BLACK);

		cpane = new ChartPanel(chart);
		frame2.add(cpane);
	}

	//2つ目の折れ線グラフの追加
	public void add1 () {
		makeData(data1);
		XYSeries series1 = new XYSeries("Test1");
		seriesAdd(series1, data1);
		render.setSeriesPaint (1, ChartColor.BLUE);
		trace.addSeries(series1);
		frame2.add(cpane);
	}

	//3つ目の折れ線グラフの追加
	public void add2 () {
		makeData(data2);
		XYSeries series2 = new XYSeries("Test2");
		seriesAdd(series2, data2);
		render.setSeriesPaint (2, ChartColor.RED);
		render.setSeriesStroke(2, new BasicStroke(5.0f));
		trace.addSeries(series2);
		frame2.add(cpane);
	}



	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("fig")) {
			MakeFig();
		} else if (cmd.equals("1")) {
			add1();
		} else if (cmd.equals("2")) {
			add2();
		}
 	}

	PlotOver (String title) {
		setTitle (title);
		setBounds (10, 10, 240, 170);
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

		JButton button = new JButton ("MakeFig");
		JButton button1 = new JButton ("Add1");
		JButton button2 = new JButton ("Add2");
		button.addActionListener(this);
		button1.addActionListener(this);
		button2.addActionListener(this);
		button.setActionCommand ("fig");
		button1.setActionCommand("1");
		button2.setActionCommand("2");
		button.setBounds (60, 10, 100, 30);
		button1.setBounds (60, 50, 100, 30);
		button2.setBounds(60, 90, 100, 30);
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(button);
		pane.add(button1);
		pane.add(button2);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		PlotOver frame = new PlotOver ("OverWrite");
		frame.setVisible (true);
	}
}

このプログラムの実行例を下記に添付する。
f:id:Aki-Miya:20150216214307p:plain


基本的には前回のプログラムと同じで、折れ線グラフの線の色と太さを変えるために、下記のようにした。

		render = new XYLineAndShapeRenderer();
		linePlot.setRenderer(0, render);
		render.setSeriesPaint (0, ChartColor.BLACK);

このソースコード

render.setSeriesPaint (0, ChartColor.BLACK);

"0"は最初に付加されたグラフを示す。ここでは、最初のグラフの線の色を黒にした。

さらに、三番目のグラフでは線の色に加えて、線の太さも下記のコードで変えた。

		render.setSeriesPaint (2, ChartColor.RED);
		render.setSeriesStroke(2, new BasicStroke(5.0f));

線の太さと同様にマーカーの色や形も変更可能で、簡単な説明は前回の記事を参考されたし。