2010-03-12 28 views
7

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

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

欢迎任何建议!

回答

7

所以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无关;我是一个满意的客户,贡献很小。

+0

(糟糕,不知道的格式在这里弄乱) – 2010-03-12 22:09:04

1

这是一个很好的讨论,如果你想要的功能拿起颜色由用户指定的该系列

添加...

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

前...

g.draw(e1); 

还有其他的功能,...利用代码完成功能来看看还有什么功能都可以针对系列名称rendereing从lookupSeries........(int seriesindex)

1

开始我发现了一个很奇怪的方式来获得,而无需连接任何线点他们。

我设置rendererStroke是细线,为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);