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
相关产品推荐
相关产品推荐

