JFreechart(Java) - 如何绘制部分虚线和部分实线的线条?

5
我将绘制一条折线图,它会从实际数据到预测数据的位置变为虚线以示区分。我不确定是否需要扩展像XYLineAndShapeRenderer这样的类,或者也许有更方便的方法来实现这一点吗?
这是使用Excel绘制的演示图表。
我说的是图表中的灰色线条。那是我想要的。 我不知道是否有渲染器可以让我指示哪个范围是虚线还是实线。
3个回答

13

我能想到两种方法来做这件事。它们都不太优雅,但这可能是你面临问题的现实。

其中一种方法是定义两个相互连接的系列。这可能是你最好的选择,但你也必须修复你的图例。

这将使你的第二个系列显示为虚线:

plot.getRenderer().setSeriesStroke(
    1, 
    new BasicStroke(
        2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
        1.0f, new float[] {6.0f, 6.0f}, 0.0f
    )

编辑:我原来的“第二个选项”是错误的。这里有一个更好的方法:

AbstractRenderer 中覆盖 getItemStroke() 方法。

     final BasicStroke dashedStroke = new BasicStroke(
                  2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                  1.0f, new float[] {6.0f, 6.0f}, 0.0f);
     XYLineAndShapeRenderer render = new XYLineAndShapeRenderer() {
        @Override
        public Stroke getItemStroke(int row, int column) {
            if (column < dashedThreshold) {
                return lookupSeriesStroke(row);
            } else {
               return dashedStroke;
            }
       };

2
+1 ...虽然 getItemStroke 不应该每次都创建一个新的 BasicStroke。它将在每次重新绘制时为每个系列的每个项目调用。 - Reverend Gonzo
谢谢。我也是这么想的。只是想看看是否有更简单的解决方案,不管怎么说还是谢谢 :) - n0obiscuitz

2

您可以扩展XYLineAndShapeRenderer,并覆盖getItemStroke,在其中为不同的项目提供不同的笔画(stroke)。

默认实现只返回系列笔画(series stroke)。


+1 在修改我的代码之后,我看到了你的解决方案... 我保证我不是在抄袭你的:P - Jordan Bentley

0
也许你应该为真实数据和预测数据定义不同的数据集。这样不仅更容易改变线条样式,而且代码可能会更清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接