1

上周我一直在尝试寻找一种方法让 JFreeChart 显示类似于下图的内容。基本上,您正在查看三个系列(上、中、下),中间有一个填充。下面有一个(浅绿色)填充颜色,或者一些人可能称之为的面积图 - 没有意义,只是为了看起来。

在此处输入图像描述

我想出的唯一真正缺少的是最后一部分:下方的填充/面积图:

在此处输入图像描述

我什至尝试将 XYDifferenceRenderer 子类化并将其与 Areachart 的渲染器结合使用,但我无法控制 areachart 的高度,基本上将绘图填充到顶部。所以这是不行的。之前创建了简单的渲染器来创建圆形条形图,我认为我可以更改 XYDifferenceRenderer 的代码。但是 XYDifferenceRenderer 的代码是相当多的几何图形和 JFree 图表的内部工作,任务有点繁重。那么关于如何以任何“正常”方式(不涉及破解 JFreeChart 的内部工作)实现此效果的任何提示?

4

1 回答 1

2

发现一篇旧帖子描述了如何在同一个情节中使用两个渲染器,这就是本例中的内容。

要在下面填充,您需要

  1. 创建两个新系列
    • 一个是差异图的下限
    • 另一个是图底部的值 - 通常为零。打电话轻松搞定plot.getRangeAxis().getLowerBound()
  2. 将它们添加到新数据集并将其添加到图中 我不知道一个图可能有多个数据集。事实证明,可以只使用索引来访问它们。
  3. 为“填充”数据集创建一个新的渲染器
    • 创建一个新的渲染器
    • 设置正确的填充油漆
    • 将新数据集的渲染器设置为新渲染器

该代码类似于以下内容,其中填充 Paint 显然取决于您:

static void addFill(Plot plot) {

    XYSeries lowerLimitSeries = ((XYSeriesCollection) (plot.getDataset())).getSeries(1);
    XYSeriesCollection fillSet = new XYSeriesCollection();
    double lowerBound = plot.getRangeAxis().getLowerBound();
    fillSet.addSeries(lowerLimitSeries);
    fillSet.addSeries(createLowerFillSeries(lowerLimitSeries, lowerBound));
    plot.setDataset(1, fillSet);
    Paint fillPaint = Color.GREEN;
    XYDifferenceRenderer fillRenderer = new XYDifferenceRenderer(fillPaint, fillPaint, false);
    fillRenderer.setSeriesStroke(0, new BasicStroke(0)); //do not show
    fillRenderer.setSeriesStroke(1, new BasicStroke(0)); //do not show
    plot.setRenderer(1, fillRenderer);
    ...
}

static XYSeries createLowerFillSeries(XYSeries lowerLimitSeries, double lowerLimit) {
    int size = lowerLimitSeries.getItems().size();
    XYSeries res = new XYSeries("lowerFillSeries");
    for (int i = 0; i < size; i++) res.add(new XYDataItem(lowerLimitSeries.getX(i), lowerLimit));
    return res;
}
于 2012-01-16T12:27:30.993 回答