【问题标题】:JFreeChart - Timeseries and CandleStick on the same chartJFreeChart - Timeseries 和 CandleStick 在同一张图表上
【发布时间】:2012-08-23 18:57:48
【问题描述】:

我正在尝试在 JFreeChart 中生成一个图表,其中包含一个重叠的烛台图和时间序列图。 (有点像)


(来源:prices-oil.org

我已尝试创建烛台图表,然后添加一个额外的 XY 系列及其渲染器,但这会导致运行时错误 org.jfree.data.xy.XYSeriesCollection cannot be cast to org.jfree.data.xy.OHLCDataset

我的一个sn-p代码如下

private XYPlot plot;
private XYSeriesCollection dataTrend;
private XYItemRenderer renderer;

public OhlcChart(BarCollection bars)
{

JFreeChart jfreechart = ChartFactory.createCandlestickChart("FX Trader Prototype", "Time", "Value", getDataset(bars), true);
plot = (XYPlot)jfreechart.getPlot();
plot.setDomainPannable(true);


NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
numberAxis.setAutoRangeIncludesZero(false);
    numberAxis.setAutoRangeStickyZero(false);
numberAxis.setUpperMargin(0.0D);
numberAxis.setLowerMargin(0.0D);

DateAxis dateAxis = (DateAxis) plot.getDomainAxis();
    SimpleDateFormat formatter  = new SimpleDateFormat("dd MMM HH:mm.ss");
    dateAxis.setDateFormatOverride(formatter);

    this.renderer = plot.getRenderer();
    Stroke myStroke = new BasicStroke((float) 1.0);

    this.renderer = new XYLineAndShapeRenderer();
    this.renderer.setSeriesPaint(0, Color.blue);
    this.renderer.setSeriesStroke(0, myStroke);

}

public OhlcChart update(Timeseries<Double> ts)
{
    Stroke myStroke = new BasicStroke((float) 1.0);
    XYLineAndShapeRenderer timeSeriesRenderer = new XYLineAndShapeRenderer();
    timeSeriesRenderer.setBaseShapesVisible(false);
    timeSeriesRenderer.setSeriesPaint(0, Color.blue);
    timeSeriesRenderer.setSeriesStroke(0, myStroke);

    UiTimeseries series = new UiTimeseries(ts);
    dataTrend.addSeries(series);
    plot.setDataset(plot.getDatasetCount()+1, dataTrend);
    plot.setRenderer(plot.getDatasetCount()+1, timeSeriesRenderer);

    return this;
}

任何建议都将不胜感激

【问题讨论】:

    标签: java overlay jfreechart candlestick-chart timeserieschart


    【解决方案1】:

    这可以使用 JFreeChart,关键是创建一个额外的数据集和渲染器

    您需要创建一个新的TimeSeriesCollection 来保存另外三个系列的数据

    TimeSeriesCollection otherDataSet = new TimeSeriesCollection();
    TimeSeries ts1 = new TimeSeries("Series 1");
    otherDataSet.addSeries(ts1);
    TimeSeries ts2 = new TimeSeries("Series 2");
    otherDataSet.addSeries(ts2);
    TimeSeries ts3 = new TimeSeries("Series 2");
    otherDataSet.addSeries(ts3);
    

    然后像往常一样将数据添加到TimeSeries

    然后您需要将otherDataSet 添加到OhlcChart 中的Plot 中,将其映射到原始绘图的同一轴 (mapDatasetToRangeAxis) 并提供Renderer

    //Add the otherDataSet to the plot and map it to the same axis at the original plot 
    int index = 1;
    plot.setDataset(index, otherDataSet);
    plot.mapDatasetToRangeAxis(index, 0);
    
    XYItemRenderer renderer2 = new XYLineAndShapeRenderer();
    plot.setRenderer(1, renderer2);
    plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
    

    这是一个使用OHLCDataset 而不是BoxAndWhiskerXYDataset 的示例

    【讨论】:

    • 非常感谢格雷厄姆。我不认为我会自己解决这个问题
    • @user1417653 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案解决了您的问题,请将其标记为已接受
    猜你喜欢
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多