Jfreechart时间序列图

时间:2013-07-03 09:36:25

标签: java exception graph time-series jfreechart

我在使用 JFreechart -Api创建时间序列图表时遇到问题。 在时间序列图表中我希望x轴显示DAYS-MONTH。它会这样做,但由于 SeriesException ,我无法在创建时间序列数据时正确设置日期。

我可以提供一个最小的例子,可以编译以查看错误是如何发生的。

我知道Month-Class可以使用Date作为参数

使用Month(Date date)-Consturctor的问题是什么?我如何设置时间序列数据的日期,以便它们出现在情节中?

(注意:不包括进口。)

public class MyTimeSeriesGraphMinimalExample {
    public static void main(String args[]) {
        TimeSeries timeseries = new TimeSeries("Series 1");
        //works not
        timeseries.add(new Month(new Date(2002, 1, 1, 12, 45, 23)),
            100.10000000000002D);//day 1
        timeseries.add(new Month(new Date(2002, 1, 2, 12, 45, 23)),
            694.10000000000002D);// day 2

        // works timeseries.add(new Month(3, 2002), 734.39999999999998D);
        // works timeseries.add(new Month(4, 2002), 453.19999999999999D);

        TimeSeries timeseries1 = new TimeSeries("Series 2");

                    //works not
        timeseries1.addOrUpdate(new Month(new Date(2002, 1, 1, 12, 45, 23)),
                234.09999999999999D);// day 1
        timeseries1.addOrUpdate(new Month(new Date(2002, 1, 2, 12, 45, 23)),
                623.70000000000005D);// day 2

        //works timeseries1.add(new Month(3, 2002), 642.5D);
        //works timeseries1.add(new Month(4, 2002), 700.39999999999998D);

        TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
        timeseriescollection.addSeries(timeseries);
        timeseriescollection.addSeries(timeseries1);
        XYDataset xydataset = timeseriescollection;

    //chart-visual-property-settings
        JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(
            "Time Series Demo 3", "Time", "Value", xydataset, true, true,
            false);
        XYPlot xyplot = (XYPlot) jfreechart.getPlot();
        DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();
        dateaxis.setTickUnit(new DateTickUnit(DateTickUnitType.MONTH, 1,
            new SimpleDateFormat("dd-MMM")));
        dateaxis.setVerticalTickLabels(true);
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot
            .getRenderer();
        xylineandshaperenderer.setBaseShapesVisible(true);
        xylineandshaperenderer.setSeriesFillPaint(0, Color.red);
        xylineandshaperenderer.setSeriesFillPaint(1, Color.green);
        xylineandshaperenderer.setSeriesPaint(0, Color.red);
        xylineandshaperenderer.setSeriesPaint(1, Color.green);
        xylineandshaperenderer.setUseFillPaint(true);
        xylineandshaperenderer
            .setLegendItemToolTipGenerator(new StandardXYSeriesLabelGenerator(
                    "Tooltip {0}"));

    //draw
        try {
            ChartUtilities.saveChartAsJPEG(new File("C:/series.jpeg"),
                jfreechart, 600, 500);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}

1 个答案:

答案 0 :(得分:3)

例外是:

org.jfree.data.general.SeriesException: 
You are attempting to add an observation for the time period February 3902 but 
the series already contains an observation for that time period. Duplicates 
are not permitted. Try using the addOrUpdate() method.

您试图在系列中添加两次相同的点。这两种:

new Month(new Date(2002, 1, 1, 12, 45, 23))  and
new Month(new Date(2002, 1, 2, 12, 45, 23))

代表同一个月。

如果您想拥有两个值,一个用于1月1日,一个用于1月2日,请使用org.jfree.data.time.Day

  timeseries.add(new Day(1, 1, 2002), 100.10000000000002D);
  timeseries.add(new Day(2, 1, 2002), 694.10000000000002D);

顺便说一下,new Month(new Date(2002, 1, 1, 12, 45, 23))是2月3902而不是2002年1月,因为java.util.Date构造函数作为参数:年份减去1900年和月份0-11之间