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);
}
}
我将 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);
}
}