You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JFreeChart K线图初始化时自动缩放至最后N根K线

问题

我开发的应用已成功实现JFreeChart K线图展示,但图表初始化时会显示全部数百根K线,导致图表尺寸过小、缩放程度低,可视性差。我希望图表初始化时自动缩放至最后N根K线,达到更清晰的展示效果。

我尝试使用setRange方法设置Date Axis的范围,该轴返回的范围格式为[09.02.2023, 23:21:02 --> 10.02.2023, 08:29:56],但始终无法正确定位到最后N根K线的区间,尝试后图表常无有效数据显示。

请问是否有方法定义最后N个数据的区间并设置Date Axis展示该范围?

附当前实现代码:

private void displayChart(String title, String quoteMarket, BarSeries series) {
    OHLCDataset dataSet = createOHLCDataset(title,series);
    JFreeChart chart = ChartFactory.createCandlestickChart(
          title,
            "Time",
            quoteMarket,
            dataSet,
            false);
    chart.setBackgroundPaint(new Color(28, 39, 57));
    chart.setBorderVisible(false);
    chart.getTitle().setPaint(Color.WHITE);
    // Candlestick rendering
    CandlestickRenderer renderer = new CandlestickRenderer();
    renderer.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_INTERVALDATA);
    renderer.setUpPaint(new Color(0, 214, 110));
    renderer.setDownPaint(new Color(196, 19, 30));
    renderer.setSeriesPaint(0,new Color(211, 211, 211));
    renderer.setCandleWidth(3.0);
    XYPlot plot = chart.getXYPlot();
    plot.setRenderer(renderer);
    plot.setRangeGridlinePaint(Color.lightGray);
    plot.setBackgroundPaint(new Color(28, 39, 57));
    plot.setDomainGridlinesVisible( false );
    plot.setRangeGridlinesVisible( false );

    NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
    numberAxis.setAutoRangeIncludesZero(false);
    numberAxis.setLabelPaint(Color.WHITE);
    numberAxis.setTickLabelPaint(Color.WHITE);
    numberAxis.setAutoRangeIncludesZero(false);


    DateAxis dateAxis = (DateAxis) plot.getDomainAxis();

    dateAxis.setAutoRange(true);
    dateAxis.setLabelPaint(Color.WHITE);
    dateAxis.setTickLabelPaint(Color.WHITE);
    dateAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
    plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
    ChartPanel panel = new ChartPanel(chart);

    panel.setMouseWheelEnabled(true);
    panel.setMouseZoomable(true);
    panel.setRangeZoomable(true);
    panel.setDomainZoomable(true);
    this.add(panel);

    System.out.println(dateAxis.getRange());
}
解决方案

要实现初始化时自动聚焦最后N根K线,核心是从OHLCDataset中提取最后N个数据点的时间范围,再手动设置给DateAxis。具体操作如下:

  1. 计算目标时间范围

    • 先获取数据集的总条目数,若总条目数大于N,计算起始索引为总条目数 - N。
    • 通过dataSet.getXValue(seriesIndex, itemIndex)获取起始和结束数据点的时间戳,转换为Date对象。
  2. 设置DateAxis的固定范围

    • 关闭自动范围(setAutoRange(false)),避免覆盖手动设置的范围。
    • 调用setRange(startDate, endDate)将轴的显示范围限定在目标区间内。

修改后的关键代码片段(以N=50为例):

DateAxis dateAxis = (DateAxis) plot.getDomainAxis();
dateAxis.setLabelPaint(Color.WHITE);
dateAxis.setTickLabelPaint(Color.WHITE);
dateAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);

// 初始化显示最后50根K线
int totalItems = dataSet.getItemCount(0);
int targetCount = 50; // 自定义需要展示的最后N根数量
if (totalItems > targetCount) {
    // 获取起始数据点的时间
    long startMillis = dataSet.getXValue(0, totalItems - targetCount).longValue();
    Date startDate = new Date(startMillis);
    // 获取最后一个数据点的时间
    long endMillis = dataSet.getXValue(0, totalItems - 1).longValue();
    Date endDate = new Date(endMillis);
    // 关闭自动范围,设置固定区间
    dateAxis.setAutoRange(false);
    dateAxis.setRange(startDate, endDate);
} else {
    // 数据不足N根时,保持自动显示全部
    dateAxis.setAutoRange(true);
}

plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
ChartPanel panel = new ChartPanel(chart);

关键注意点

  • 确保数据集是按时间从小到大有序排列的,否则起始索引对应的时间会出错。
  • 可以打印startDate和endDate的值,验证时间区间是否正确,避免因索引计算错误导致无数据显示。
  • 如果后续需要动态更新数据,记得重新计算并更新轴的范围。

内容的提问来源于stack exchange,提问作者BitQueen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:36:00