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

JFreeChart中XYPlot如何在序列末端右侧显示价格标签?

在JFreeChart时间序列图中添加末端价格标签

需求背景

使用JFreeChart的TimeSeriesChart结合XYPlot,配置了日期轴(DateAxis)和对数类型的值轴(LogAxis)展示多组时间序列,需要在每个序列的末端右侧(对应原右侧轴位置)显示该序列的最终价格,且不需要显示右侧轴的标签、刻度等元素,效果为每个序列末端旁标注对应价格,与序列颜色匹配。

实现方案

1. 配置隐藏的右侧辅助轴

添加一个与左侧同类型的对数轴,仅用于坐标计算,完全隐藏视觉元素:

// 创建无标签的右侧对数轴
LogAxis rightValueAxis = new LogAxis(null);
// 隐藏轴的所有视觉元素
rightValueAxis.setTickLabelsVisible(false);
rightValueAxis.setTickMarksVisible(false);
rightValueAxis.setAxisLineVisible(false);
// 将右侧轴添加到plot,索引为1
XYPlot plot = (XYPlot) chart.getPlot();
plot.setRangeAxis(1, rightValueAxis);
// 把所有数据集关联到右侧轴,确保标签坐标计算基于右侧轴位置
for (int i = 0; i < plot.getSeriesCount(); i++) {
    plot.mapDatasetToRangeAxis(i, 1);
}

2. 自定义末端标签生成器

仅在每个序列的最后一个数据点生成价格标签:

XYItemLabelGenerator endPriceLabelGenerator = new XYItemLabelGenerator() {
    @Override
    public String generateLabel(XYDataset dataset, int series, int item) {
        // 只处理序列的最后一个数据点
        if (item != dataset.getItemCount(series) - 1) {
            return null;
        }
        double endValue = dataset.getYValue(series, item);
        // 格式化价格,可根据需求调整小数位数
        return NumberFormat.getNumberInstance().format(endValue);
    }
};

3. 配置渲染器的标签属性

设置标签显示位置为数据点右侧,绑定生成器并匹配序列颜色:

XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
// 启用标签显示
renderer.setDefaultItemLabelsVisible(true);
// 设置自定义标签生成器
renderer.setDefaultItemLabelGenerator(endPriceLabelGenerator);
// 设置标签在数据点右侧的对齐方式
renderer.setDefaultPositiveItemLabelPosition(new ItemLabelPosition(
        ItemLabelAnchor.OUTSIDE12, TextAnchor.CENTER_LEFT
));
renderer.setDefaultNegativeItemLabelPosition(new ItemLabelPosition(
        ItemLabelAnchor.OUTSIDE6, TextAnchor.CENTER_RIGHT
));
// 让标签颜色与对应序列颜色一致
for (int seriesIndex = 0; seriesIndex < plot.getSeriesCount(); seriesIndex++) {
    renderer.setSeriesItemLabelPaint(seriesIndex, renderer.getSeriesPaint(seriesIndex));
    renderer.setSeriesItemLabelFont(seriesIndex, new Font("SansSerif", Font.PLAIN, 10));
}

4. 调整图表边距避免标签被裁剪

给图表右侧留出足够空间放置标签:

plot.setInsets(new Insets(5, 5, 5, 35)); // 右侧边距设为35像素,可按需调整

注意事项

  • 左侧轴的对数刻度与右侧轴完全一致,标签的数值精度与左侧轴保持统一
  • 若序列最后一个数据点接近图表右边缘,可适当调整图表整体宽度或右侧边距,确保标签完整显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:14