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

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

JFreeChartを使って、グラフを破線で表示する。

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Stroke;
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.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.TickUnit;
import org.jfree.chart.axis.TickUnits;
import org.jfree.chart.axis.ValueAxis;
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 FigTest2 extends JFrame implements ActionListener {
	Random rand = new Random();
	
	//Figを作成
	public void MakeFig() {
		JFrame figFrame = new JFrame("Fig");
		figFrame.setSize(500, 400);
		figFrame.setLocationRelativeTo(null);
		figFrame.setVisible(true);
		
		//グラフに表示するデータの作成
		int [] data = new int [50];
		for (int i = 0; i < 50; i++) {
			data[i] = rand.nextInt(100) + 1;
		}
		
		XYSeriesCollection trace = new XYSeriesCollection();
		XYSeries series = new XYSeries("Trace");
		
		//XYSeriesへのデータの追加
		for (int i = 0; i < 50; i++) {
			series.add(i, data[i]);
		}	
		trace.addSeries(series);
		
		//JFreeChartの作成
		JFreeChart chart = ChartFactory.createXYLineChart(
				" ",
				"Frame",
				"Value",
				trace,
				PlotOrientation.VERTICAL,
				true,
				false,
				false);
		
		//レジェンドの除去
		chart.removeLegend();
	
		//X軸とY軸の目盛間隔の変更
		XYPlot plot = chart.getXYPlot();	
		ValueAxis xAxis = plot.getDomainAxis();
		ValueAxis yAxis = plot.getRangeAxis();
		TickUnits tx = new TickUnits();
		TickUnits ty = new TickUnits();
		TickUnit uniX = new NumberTickUnit(10);
		TickUnit uniY = new NumberTickUnit(20);
		tx.add(uniX);
		ty.add(uniY);
		xAxis.setStandardTickUnits(tx);
		yAxis.setStandardTickUnits(ty);
		
		//グラフの背景の色を指定
		plot.setBackgroundPaint(Color.white);
		
		//グラフを破線にする
		float dash [] = {4f, 5f};
		Stroke dashed = new BasicStroke(2f,
                BasicStroke.CAP_BUTT,
                BasicStroke.JOIN_MITER,
                10.0f,
                dash,
                0.0f);
		
		XYLineAndShapeRenderer render = new XYLineAndShapeRenderer();
		render.setSeriesStroke(0, dashed);		
		plot.setRenderer(render);

	
		//Chartを貼り付ける用のPanelの作成とフレームへの貼り付け
		ChartPanel cpane = new ChartPanel(chart);
		figFrame.getContentPane().add(cpane);		
	}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("Open")) {
			MakeFig();
		}
	}
	
	FigTest2 () {
		JButton button = new JButton ("Make Fig");
		button.setBounds(40, 10, 90, 30);
		button.addActionListener(this);
		button.setActionCommand("Open");
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(button);
		getContentPane().add(pane, BorderLayout.CENTER);
	}
	 
	public static void main(String[] args) {
		FigTest2 frame = new FigTest2 ();
		frame.setTitle("Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(10, 10, 180, 90);
		frame.setVisible(true);
	}
}

このプログラムの実行例は次のようになる。
f:id:Aki-Miya:20150320122832p:plain

グラフ表示を破線にするコードは下記で、

		//グラフを破線にする
		float dash [] = {4f, 5f};
		Stroke dashed = new BasicStroke(2f,
                BasicStroke.CAP_BUTT,
                BasicStroke.JOIN_MITER,
                10.0f,
                dash,
                0.0f);
		
		XYLineAndShapeRenderer render = new XYLineAndShapeRenderer();
		render.setSeriesStroke(0, dashed);		
		plot.setRenderer(render);

この中の

     float dash [] = {4f, 5f};

の部分で、破線パターンを決めている。線を引く長さが"4f"で、空白になる長さが"5f"である。

また、

    Stroke dashed = new BasicStroke(2f,

の"2f"は線の太さを示す。

他の項目の詳細は、OracleのHPBasicStroke (Java Platform SE 6)を参照されたし。