我正在使用JFreeChart和Java来使用boxplot图表来评估实验结果。我想改变异常值和远距离条目的颜色和形状。
当我使用普通的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);
在这里,我无法改变异常值的颜色和形状。我希望它们是黑色的,而不是它们系列的颜色。而且我希望它们看起来像小十字架而不是这些大空圈。 此外,根本没有显示任何远程值,似乎其中一个异常值被切断了。
然后我找到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;
}
但是,我也不喜欢这些情节。即使我将它们设置为黑色,我的情节中的胡须/轮廓也不再是黑色。即使我将其设置为不可见,也可以再次看到均值。大量的异常值看起来很荒谬,让我想知道为什么在普通渲染器的情节下没有远处。
如果有人能帮助我解决这些较小的外观问题,那将是非常好的。否则,我只会把目前的情节与奇怪的异常情况和遗漏的远方拍摄......
答案 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);
}
}