【问题标题】:Plot points instead of lines? JFreeChart PolarChart绘制点而不是线? JFreeChart PolarChart
【发布时间】:2010-03-12 16:07:02
【问题描述】:

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

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

欢迎提出任何建议!

【问题讨论】:

    标签: plot jfreechart


    【解决方案1】:

    所以DefaultPolarItemRenderer 接收所有极点,将极点转换为常规Java2D 坐标,用这些点创建Polygon,然后绘制它。以下是我如何绘制点而不是多边形:

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

    【讨论】:

      【解决方案2】:

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

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

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

      如果这是未知领域,我会推荐The JFreeChart Developer Guide†。

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

      【讨论】:

        【解决方案3】:

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

        添加...

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

        在……之前

        g.draw(e1);
        

        还有其他功能...使用代码完成来查看名称从 lookupSeries........(int seriesindex) 开始的系列渲染还有哪些其他功能可用

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-28
            相关资源
            最近更新 更多