package com.isaac.stock.utils; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.NumberTickUnit; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import javax.swing.*; /** * Created by zhanghao on 26/7/17. * Modified by zhanghao on 28/9/17. * @author ZHANG HAO */ public class PlotUtil { public static void plot(double[] predicts, double[] actuals, String name) { double[] index = new double[predicts.length]; for (int i = 0; i < predicts.length; i++) index[i] = i; int min = minValue(predicts, actuals); int max = maxValue(predicts, actuals); final XYSeriesCollection dataSet = new XYSeriesCollection(); addSeries(dataSet, index, predicts, "Predicts"); addSeries(dataSet, index, actuals, "Actuals"); final JFreeChart chart = ChartFactory.createXYLineChart( "Prediction Result", // chart title "Index", // x axis label name, // y axis label dataSet, // data PlotOrientation.VERTICAL, true, // include legend true, // tooltips false // urls ); XYPlot xyPlot = chart.getXYPlot(); // X-axis final NumberAxis domainAxis = (NumberAxis) xyPlot.getDomainAxis(); domainAxis.setRange((int) index[0], (int) (index[index.length - 1] + 2)); domainAxis.setTickUnit(new NumberTickUnit(20)); domainAxis.setVerticalTickLabels(true); // Y-axis final NumberAxis rangeAxis = (NumberAxis) xyPlot.getRangeAxis(); rangeAxis.setRange(min, max); rangeAxis.setTickUnit(new NumberTickUnit(50)); final ChartPanel panel = new ChartPanel(chart); final JFrame f = new JFrame(); f.add(panel); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } private static void addSeries (final XYSeriesCollection dataSet, double[] x, double[] y, final String label){ final XYSeries s = new XYSeries(label); for( int j = 0; j < x.length; j++ ) s.add(x[j], y[j]); dataSet.addSeries(s); } private static int minValue (double[] predicts, double[] actuals) { double min = Integer.MAX_VALUE; for (int i = 0; i < predicts.length; i++) { if (min > predicts[i]) min = predicts[i]; if (min > actuals[i]) min = actuals[i]; } return (int) (min * 0.98); } private static int maxValue (double[] predicts, double[] actuals) { double max = Integer.MIN_VALUE; for (int i = 0; i < predicts.length; i++) { if (max < predicts[i]) max = predicts[i]; if (max < actuals[i]) max = actuals[i]; } return (int) (max * 1.02); } }