2011-06-30 12 views
1

極座標の異なる領域を色分けして色分けしようとしています。例えば、角度20と60との間、および半径2と4との間の領域を着色する。 どうすればよいのだろうか?私は形状の注釈を使用することを考えていましたが、そこから円弧を描いていましたが、極座標の図形注釈はないようです。 アイデア は、一般的にPolarPlotで使用DefaultPolarItemRendererシリーズが満たされているかどうかを制御する方法setSeriesFilled()を、持っているあなたに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

ありがとうございます。レンダラーは、AlphaComposite.SRC_OVERモードの値を50%と指定しているので、重なり合った塗りが特に目立ちます。

補遺:createDataset()に2πまでこのexampleから始まり、6πからのデータ・セットのドメインを減らし、下の見チャートを作成するには:

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

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

はその後createChart()で満たされたシリーズを作ります

enter image description here

+0

ありがとうございます。あなたは例がありますか? – jpo

+0

私は上記で詳しく説明しました。 – trashgod

+0

私はコーナーのテキスト項目の上限を変更するのを忘れました。 – trashgod

関連する問題