2011-06-30 123 views
1

我想用不同的顏色爲極座標圖的不同區域着色。例如將角度20和60之間以及半徑2和4之間的區域着色。 我該怎麼做?我正在考慮使用形狀註記並從那裏繪製弧線,但似乎沒有極座標圖的形狀註記。 任何想法? 謝謝JFreechart極座標圖形狀註釋

import java.awt.Color; 
import java.awt.Dimension; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.axis.NumberTick; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.plot.PolarPlot; 
import org.jfree.chart.renderer.DefaultPolarItemRenderer; 
import org.jfree.chart.renderer.PolarItemRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.TextAnchor; 

public class test2 extends JFrame { 

    private static final String title = "Archimedes' Spiral"; 

    public test2(String title) { 
     super(title); 
     JFreeChart chart = createChart(createDataset()); 
     ChartPanel panel = new ChartPanel(chart); 
     panel.setPreferredSize(new Dimension(500, 500)); 
     panel.setMouseZoomable(false); 
     this.add(panel); 
    } 

    private static XYDataset createDataset() { 
     XYSeriesCollection result = new XYSeriesCollection(); 
     XYSeries series = new XYSeries(title); 
     XYSeries ser = new XYSeries("test"); 
     for (int t = 0; t <= 1 * 360; t++) { 
      series.add(90 - t, t); 
     } 

     for (int t = 0; t <= 1 * 120; t++) { 
      ser.add(90 - t, 40); 
      ser.add(90 - t, 120); 
     } 
     result.addSeries(series); 
     result.addSeries(ser); 
     return result; 
    } 

    private static JFreeChart createChart(XYDataset dataset) { 
     ValueAxis radiusAxis = new NumberAxis(); 
     radiusAxis.setTickLabelsVisible(false); 
     PolarItemRenderer renderer = new DefaultPolarItemRenderer(); 
     PolarPlot plot = new PolarPlot(dataset, radiusAxis, renderer) { 

      @Override 
      protected List refreshAngleTicks() { 
       List<NumberTick> ticks = new ArrayList<NumberTick>(); 
       int delta = (int) this.getAngleTickUnit().getSize(); 
       for (int t = 0; t < 360; t += delta) { 
        int tp = (360 + 90 - t) % 360; 
        NumberTick tick = new NumberTick(
         Double.valueOf(t), String.valueOf(tp), 
         TextAnchor.CENTER, TextAnchor.CENTER, 0.0); 
        ticks.add(tick); 
       } 
       return ticks; 
      } 
     }; 
     plot.setBackgroundPaint(new Color(0x00f0f0f0)); 
     plot.setRadiusGridlinePaint(Color.gray); 
     plot.addCornerTextItem("r(θ) = θ; 0 < θ < 6π"); 
     DefaultPolarItemRenderer ren = new DefaultPolarItemRenderer(); 
     ren.setSeriesFilled(0, true); 
     ren.setSeriesFilled(1, true); 
     plot.setRenderer(ren); 
     JFreeChart chart = new JFreeChart(
      title, JFreeChart.DEFAULT_TITLE_FONT, plot, true); 
     chart.setBackgroundPaint(Color.white); 
     return chart; 
    } 

    public static void main(String[] args) { 
     test2 demo = new test2(title); 
     demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     demo.pack(); 
     demo.setLocationRelativeTo(null); 
     demo.setVisible(true); 
    } 
} 

回答

1

通常在PolarPlot使用的DefaultPolarItemRenderer有方法setSeriesFilled(),控制系列是否被填滿。渲染器指定AlphaComposite.SRC_OVER模式的值爲50%,因此重疊填充看起來特別好。

附錄:要創建如下圖所示的圖表中,開始與這個example和6π減少數據集的域createDataset()到2π:

for (int t = 0; t <= 1 * 360; t++) { ... 

然後使該系列產品填補了createChart()

... 
DefaultPolarItemRenderer renderer = new DefaultPolarItemRenderer(); 
renderer.setSeriesFilled(0, true); 
... 

enter image description here

+0

謝謝。你有一個例子嗎? – jpo

+0

我已經詳細闡述過了。 – trashgod

+0

糟糕,我忘了更改角落文本項目的上限。 – trashgod