2015-02-06 105 views
1

我正在使用JFreeChart和Java来评估使用boxplot图表的实验结果。我想改变异常值和异常条目的颜色和形状。JFreeChart Boxplot孤立点和Farout外观

这是我的地块目前看起来怎么样,当我使用正常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,其允许编辑两个异常值和farouts的颜色和形状。这是一个样子: ExtendedRenderer plot 我成立了像以前一样的渲染,但我添加了两行设置为离群和farout条目的颜色:

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

我也尝试的形状离群通过减少扩展渲染器的实施cirle RADUIS到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; 
} 

不过,我不喜欢这些情节太多要么。即使我将它们设置为黑色,我的阴谋/轮廓也不再是黑色。即使我将它设置为不可见,平均值仍然可见。而大量的异常值看起来有点荒谬,让我想知道为什么在正常渲染器的情节中根本没有远见。

如果任何人都可以帮助我解决这些较小的外观问题,那将非常好。否则,我只是将目前的情节与怪异的离群值和缺少的远...

回答

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

+0

我必须复制drawVerticalItem'的'整个源代码或者是有一些方法我可能只是调用'super.something'? – CGFoX 2015-02-08 11:00:09

+1

调用'super'实现将简单地调用原始方法,而不是您的变体;另一种方法是构建表单源。 – trashgod 2015-02-08 16:19:26