2010-03-12 50 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);