JFreeChart Boxplot Outlier 和 Farout 外观

JFreeChart Boxplot Outlier and Farout appearance

我将 JFreeChart 与 Java 结合使用,以使用箱线图评估实验结果。我想更改异常值和 farout 条目的颜色和形状。

当我使用普通的 BoxAndWhiskerRenderer 时,我的绘图目前是这样的: 我这样设置渲染器:

BoxAndWhiskerRenderer renderer = new BoxAndWhiskerRenderer();
renderer.setFillBox(true);
renderer.setSeriesPaint(0, Color.DARK_GRAY);
renderer.setSeriesPaint(1, Color.LIGHT_GRAY);
renderer.setSeriesOutlinePaint(0, Color.BLACK);
renderer.setSeriesOutlinePaint(1, Color.BLACK);
renderer.setUseOutlinePaintForWhiskers(true);   
Font legendFont = new Font("SansSerif", Font.PLAIN, 15);
renderer.setLegendTextFont(0, legendFont);
renderer.setLegendTextFont(1, legendFont);
renderer.setMeanVisible(false);

在这里,我无法更改异常值的颜色和形状。我希望它们是黑色的,而不是它们系列的颜色。我希望它们看起来像小十字,而不是这些大的空心圆圈。 也根本没有显示 farout 值,似乎其中一个异常值被切断了。

然后我找到了 ExtendedBoxAndWhiskerRenderer,它允许编辑离群值和远值的颜色和形状。这就是它的样子: 我像以前一样设置渲染器,但我添加了两行来设置异常值和最远条目的颜色:

renderer.setOutlierPaint(Color.BLACK);      renderer.setFaroutPaint(Color.LIGHT_GRAY);

我还通过将扩展渲染器实现中的圆半径减少到 1.0 而不是 2.0 来试验异常值的形状:

private Shape createEllipse(Point2D point, double oRadius) {
        Ellipse2D dot = new Ellipse2D.Double(point.getX(), point.getY(), oRadius*1.0, oRadius*1.0);
        return dot;
}

不过,我也不太喜欢这些情节。即使我将它们设置为黑色,我的地块的 Whiskers/Outlines 也不再是黑色了。即使我将其设置为不可见,均值再次可见。大量的异常值看起来有点荒谬,让我想知道为什么在普通渲染器的绘图中根本没有 farouts。

如果有人能帮我解决这些较小的外观问题,那就太好了。否则,我将只使用看起来很奇怪的异常值和缺失的 farouts 来绘制当前图...

虽然 ExtendedBoxAndWhiskerRenderer 堪称典范,但它有些过时,并且其大部分功能已合并到主线版本中。您的实验表明旧渲染器和新数据集不兼容。

因为异常值渲染方法是私有的,另一种方法是覆盖相关的 draw*Item() 方法并让它调用您自己的变体。您需要根据需要使用 public 访问器来概括现有代码。概括地说,以下变体演示了使用 Color.black,如下图所示。

plot.setRenderer(new BoxAndWhiskerRenderer() {

    @Override
    public void drawVerticalItem(Graphics2D g2, …) {
        // existing code that calls the methods below
    }

    private void drawEllipse(Point2D point, double oRadius, Graphics2D g2) {
        Paint temp = g2.getPaint();
        g2.setColor(Color.black);
        Ellipse2D dot = new Ellipse2D.Double(point.getX() + oRadius / 2,
                point.getY(), oRadius, oRadius);
        g2.draw(dot);
        g2.setPaint(temp);
    }

    private void drawHighFarOut(double aRadius, Graphics2D g2, double xx,
            double m) {
        Paint temp = g2.getPaint();
        g2.setColor(Color.black);
        double side = aRadius * 2;
        g2.draw(new Line2D.Double(xx - side, m + side, xx + side, m + side));
        g2.draw(new Line2D.Double(xx - side, m + side, xx, m));
        g2.draw(new Line2D.Double(xx + side, m + side, xx, m));
        g2.setPaint(temp);
    }
}