6

目前,PolarChart 将所有坐标与创建多边形的线连接起来。我只是希望它用一个点来绘制每个点,而不是将它们连接在一起。这可能吗?

我曾尝试使用translateValueThetaRadiusToJava2D()和 Graphics2D 来绘制圆圈,但它非常笨拙和做作。

欢迎任何建议!

4

4 回答 4

6

因此,DefaultPolarItemRenderer接受所有极点,将极点转换为常规 Java2D 坐标,Polygon用这些点生成 a 然后绘制它。这是我如何绘制点而不是多边形:

public class MyDefaultPolarItemRenderer extends DefaultPolarItemRenderer {

    @Override
    public void drawSeries(java.awt.Graphics2D g2, java.awt.geom.Rectangle2D dataArea, PlotRenderingInfo info, PolarPlot plot, XYDataset dataset, int seriesIndex) {


        int numPoints = dataset.getItemCount(seriesIndex);
        for (int i = 0; i < numPoints; i++) {

            double theta = dataset.getXValue(seriesIndex, i);
            double radius = dataset.getYValue(seriesIndex, i);
            Point p = plot.translateValueThetaRadiusToJava2D(theta, radius,
                    dataArea);
            Ellipse2D el = new Ellipse2D.Double(p.x, p.y, 5, 5);
            g2.fill(el);
            g2.draw(el);
        }
    }
}

然后在别处实例化这个类:

    MyDefaultPolarItemRenderer dpir = new MyDefaultPolarItemRenderer();
    dpir.setPlot(plot);
    plot.setRenderer(dpir);
于 2010-03-17T18:12:11.523 回答
2

这个有点难 给定 a PolarPlot,您可以获得它AbstractRenderer并设置形状。例如,

PolarPlot plot = (PolarPlot) chart.getPlot();
AbstractRenderer ar = (AbstractRenderer) plot.getRenderer();
ar.setSeriesShape(0, ShapeUtilities.createDiamond(5), true);

菱形将出现在图例中,但DefaultPolarItemRenderer既不呈现形状,也不提供线条控制。您必须扩展默认渲染器并覆盖drawSeries(). XYLineAndShapeRenderer是学习的好榜样;你可以看到它是如何使用的TimeSeriesChartDemo1

如果这对您来说是未知领域,我会推荐JFreeChart 开发人员指南†</sup>。

†</sup>免责声明:不隶属于 Object Refinery Limited;我是一个满意的客户和非常小的贡献者。

于 2010-03-12T20:43:01.603 回答
1

这是一个很好的讨论,以防您希望该功能获取用户分配给该系列的颜色

添加 ...

Color c =(Color)this.lookupSeriesPaint(seriesIndex);
g2.setColor(c);

前 ...

g.draw(e1);

还有其他功能...使用代码完成查看其他功能可用于系列渲染,名称从lookupSeries........(int seriesindex)

于 2011-05-05T10:23:38.997 回答
1

我找到了一种相当奇怪的方法来获取点,而无需任何线连接它们。

我将渲染器的Stroke设置细线,虚线相位为 0,长度为 1e10:

Stroke dashedStroke = new BasicStroke(
                          0.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                          0.0f, new float[] {0.0f, 1e10f}, 1.0f );
renderer.setSeriesStroke(0, dashedStroke);
于 2017-06-27T11:47:01.130 回答