我在构建组合烛台图表和折线图时遇到问题(两者都在同一个图上)。对于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;
}
我无法弄清楚为什么在折线图上有这样的偏移,但是你看到我为所有数据集设置了相同的时区。
提前感谢您的帮助。
答案 0 :(得分:0)
在JFreeChart的TimeSeries
类中,x值是时间段而不是特定时间点。 TimeSeriesCollection
类通过XYDataset
接口显示此数据,并且必须为每个数据项选择特定的x值。 setXPosition
方法(在TimeSeriesCollection
中)设置一个标志,用于确定使用时间段中的哪个点(开始,中间或结束)。