JFreeChart - 结合TimeSeries和OHLCDataset - 第二个数据集被移位

时间:2017-06-25 16:38:52

标签: jfreechart

我在构建组合烛台图表和折线图时遇到问题(两者都在同一个图上)。对于Candlesticks,我使用OHLCDataset,对于“移动平均线”线图,我使用TimeSeries。但是,线图会沿着轴在错误的时间点绘制。我已经打印了所有DateTime元素以使shure我没有设置错误的时间或日期,但是在打印时它们确切地显示了他们应该的日期时间。然而,在图表中他们太早开始6个小时。我首先想到这将是一个时区问题,但我将时区设置为EST。

以下是创建数据集并将其分配给XYPlot的代码片段

OHLCDataset检索方法(time [i]是日期对象):

public OHLCDataset getOHLCDataset(){
    OHLCSeries ohlcSeries = new OHLCSeries("Candlesticks");
    for(int i=0; i<close.length; i++){
        ohlcSeries.add(RegularTimePeriod.createInstance(Minute.class, time[i], TimeZone.getTimeZone("EST")), open[i], max[i], min[i], close[i]);
    }
    OHLCSeriesCollection ohlcCollection = new OHLCSeriesCollection();
    ohlcCollection.addSeries(ohlcSeries);
    return ohlcCollection;
}

TimeSeries检索方法(time [i]是日期对象 - 与上面相同):

public XYDataset getAverageXYDataset(int periods, int frame){
    TimeSeries x = new TimeSeries("moving average " + periods + " periods");
    if(frame>60){
        for(int i=periods-1; i<close.length; i++){
            double sum = 0;
            for(int j=i; j>i-periods; j--){
                sum += close[j];
            }
            x.add(RegularTimePeriod.createInstance(Hour.class, time[i], TimeZone.getTimeZone("EST")), sum/periods);
        }
    }else{
        for(int i=periods-1; i<close.length; i++){
            double sum = 0;
            for(int j=i; j>i-periods; j--){
                sum += close[j];
            }
            x.add(RegularTimePeriod.createInstance(Minute.class, time[i], TimeZone.getTimeZone("EST")), sum/periods);
        }
    }
    return new TimeSeriesCollection(x);
}

将数据集添加到绘图中的代码:

OHLCDataset dataset1 = dataset.getOHLCDataset();
XYDataset smallAverageDataset = dataset.getAverageXYDataset(20, period);
XYDataset bigAverageDataset = dataset.getAverageXYDataset(50, period);

// create the jfreechart - add candlestickdataset first
String title2 = dataset.getTime()[0] + " - " + dataset.getTime()[dataset.getTime().length-1];
JFreeChart chart = createChart(dataset1, title2);

// get the xyplot and set other datasets
chart.getXYPlot().setDataset(1, smallAverageDataset);
chart.getXYPlot().setDataset(2, bigAverageDataset);

这是方法createChart:

private static JFreeChart createChart(final OHLCDataset dataset, String title) {
    DateAxis xAxis = createXAxis();
    NumberAxis yAxis = createYAxis();
    MyCandlestickRenderer candlestickRenderer = createCandlestickRenderer();
    plot = new XYPlot(dataset, xAxis, yAxis, candlestickRenderer);
    JFreeChart chart = new JFreeChart(
            title, 
            new Font("SansSerif", Font.BOLD, 24), 
            plot, 
            false
    );
    return chart;        
}

这是createXAxis方法:

private static DateAxis createXAxis(){
    DateAxis domainAxis = new DateAxis();
    domainAxis.setAutoRange(true);
    domainAxis.setTickLabelsVisible(true);
    domainAxis.setAutoTickUnitSelection(true);
    return domainAxis;
}

我无法弄清楚为什么在折线图上有这样的偏移,但是你看到我为所有数据集设置了相同的时区。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在JFreeChart的TimeSeries类中,x值是时间段而不是特定时间点。 TimeSeriesCollection类通过XYDataset接口显示此数据,并且必须为每个数据项选择特定的x值。 setXPosition方法(在TimeSeriesCollection中)设置一个标志,用于确定使用时间段中的哪个点(开始,中间或结束)。