JFreeChart Boxplot Outlier和Farout外观

时间:2015-02-06 11:57:31

标签: java plot statistics jfreechart evaluation

我正在使用JFreeChart和Java来使用boxplot图表来评估实验结果。我想改变异常值和远距离条目的颜色和形状。

当我使用普通的BoxAndWhiskerRenderer时,这就是我的图表当前的样子:Current plot 我像这样设置了渲染器:

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);

在这里,我无法改变异常值的颜色和形状。我希望它们是黑色的,而不是它们系列的颜色。而且我希望它们看起来像小十字架而不是这些大空圈。 此外,根本没有显示任何远程值,似乎其中一个异常值被切断了。

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

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;
}

但是,我也不喜欢这些情节。即使我将它们设置为黑色,我的情节中的胡须/轮廓也不再是黑色。即使我将其设置为不可见,也可以再次看到均值。大量的异常值看起来很荒谬,让我想知道为什么在普通渲染器的情节下没有远处。

如果有人能帮助我解决这些较小的外观问题,那将是非常好的。否则,我只会把目前的情节与奇怪的异常情况和遗漏的远方拍摄......

1 个答案:

答案 0 :(得分:3)

虽然ExtendedBoxAndWhiskerRenderer是示例性的,但它有点过时,其大部分功能已合并到主线版本中。您的实验表明旧渲染器和新数据集不兼容。

因为异常值渲染方法是私有的,所以另一种方法是覆盖相关的draw*Item()方法并让它调用您自己的变体。您需要根据需要使用公共访问器概括现有代码。概括地说,以下变体演示了使用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);
    }
}

image