3

JFreechart -Apiを使用して時系列グラフを作成する際に問題が発生しています。時系列グラフでは、x 軸に DAYS-MONTH を表示します。そうしますが、SeriesExceptionのため、時系列データを作成するときに日を正しく設定できません。

エラーがどのように発生するかを確認するためにコンパイルできる最小限の例を提供できます。

Month-Class は Date を引数として取ることができることを知っています

Month(Date date)-Consturctor を使用する際の問題は何ですか? そして、プロットに表示されるように、timeseries-data で日を設定するにはどうすればよいですか?

(注:インポートは含まれていません。)

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
        }
    }
}
4

1 に答える 1

4

例外は次のとおりです。

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.

シリーズに同じポイントを 2 回追加しようとしています。両方:

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 日の 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))、2002 年 1 月ではなく 2 月 3902です: 年 - 1900 と 0-11 の間の月java.util.Date

于 2013-07-03T11:12:01.843 に答える