2011-07-12 201 views
9

我有成千上萬的點繪製在散點圖上。 現在的問題是我的程序是用「正方形」繪製點,但是我需要一些關於如何將點從「方塊」更改爲「圓點/圓圈」的幫助。 任何幫助,將不勝感激。更改散點圖中點的形狀

// * 我使用ShapeUtilities,但是當我使用XYItemRenderer/XYDotRenderer其不改變點,以「DaigonalCross」形 - 任何更正如有錯誤anythng在代碼.. * ///

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Shape; 
import java.util.*; 
import javax.swing.JPanel; 
import org.jfree.chart.*; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.chart.renderer.xy.XYDotRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 
import org.jfree.util.ShapeUtilities; 

public class SPlotfinal extends ApplicationFrame { 

    public SPlotfinal(String s) { 
     super(s); 
     JPanel jpanel = createDemoPanel(); 
     jpanel.setPreferredSize(new Dimension(500, 270)); 
     setContentPane(jpanel); 
    } 

    public static JPanel createDemoPanel() { 

     JFreeChart jfreechart = ChartFactory.createScatterPlot("Scatter Plot Demo", 
      "X", "Y", samplexydataset2(), PlotOrientation.VERTICAL, true, true, false); 
     Shape cross = ShapeUtilities.createDiagonalCross(3, 1); 

     XYPlot xyPlot = (XYPlot) jfreechart.getPlot(); 
     XYItemRenderer renderer = xyPlot.getRenderer(); 
     renderer.setBaseShape(cross); 
     renderer.setBasePaint(Color.red); 
     //changing the Renderer to XYDotRenderer 
     //xyPlot.setRenderer(new XYDotRenderer()); 
     XYDotRenderer xydotrenderer = new XYDotRenderer(); 
     xyPlot.setRenderer(xydotrenderer); 
     xydotrenderer.setSeriesShape(0, cross); 

     xyPlot.setDomainCrosshairVisible(true); 
     xyPlot.setRangeCrosshairVisible(true); 

     return new ChartPanel(jfreechart); 
    } 

    private static XYDataset samplexydataset2() { 
     int cols = 20; 
     int rows = 20; 
     double[][] values = new double[cols][rows]; 

     XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 
     XYSeries series = new XYSeries("Random"); 
     Random rand = new Random(); 
     for (int i = 0; i < values.length; i++) { 
      for (int j = 0; j < values[i].length; j++) { 
       double x = Math.round(rand.nextDouble() * 500); 
       double y = Math.round(rand.nextDouble() * 500); 

       series.add(x, y); 
      } 
     } 
     xySeriesCollection.addSeries(series); 
     return xySeriesCollection; 
    } 

    public static void main(String args[]) { 
     SPlotfinal scatterplotdemo4 = new SPlotfinal("Scatter Plot Demo 4"); 
     scatterplotdemo4.pack(); 
     RefineryUtilities.centerFrameOnScreen(scatterplotdemo4); 
     scatterplotdemo4.setVisible(true); 
    } 
} 
+1

+1 [sscce](http://sscce.org/)。 – trashgod

回答

17

ScatterRenderer繼承AbstractRenderergetItemShape()。您可以覆蓋getItemShape()以提供您自己的形狀。

附錄:此方法的一個優點是您可以爲每個系列中的每個項目指定一個Shape

附錄:要使用ShapeUtilities.createDiagonalCross(),做這樣的事情:

Shape cross = ShapeUtilities.createDiagonalCross(3, 1); 
plot = (XYPlot) chart.getPlot(); 
renderer = plot.getRenderer(); 
renderer.setSeriesShape(0, cross); 

附錄:只需切換到setSeriesShape()。另外,請跳過XYDotRendererMath.round()

Scatter Plot Demo

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Shape; 
import java.util.*; 
import javax.swing.JPanel; 
import org.jfree.chart.*; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 
import org.jfree.util.ShapeUtilities; 

public class SPlotfinal extends ApplicationFrame { 

    public SPlotfinal(String s) { 
     super(s); 
     JPanel jpanel = createDemoPanel(); 
     jpanel.setPreferredSize(new Dimension(640, 480)); 
     add(jpanel); 
    } 

    public static JPanel createDemoPanel() { 
     JFreeChart jfreechart = ChartFactory.createScatterPlot(
      "Scatter Plot Demo", "X", "Y", samplexydataset2(), 
      PlotOrientation.VERTICAL, true, true, false); 
     Shape cross = ShapeUtilities.createDiagonalCross(3, 1); 
     XYPlot xyPlot = (XYPlot) jfreechart.getPlot(); 
     xyPlot.setDomainCrosshairVisible(true); 
     xyPlot.setRangeCrosshairVisible(true); 
     XYItemRenderer renderer = xyPlot.getRenderer(); 
     renderer.setSeriesShape(0, cross); 
     renderer.setSeriesPaint(0, Color.red); 
     return new ChartPanel(jfreechart); 
    } 

    private static XYDataset samplexydataset2() { 
     int cols = 20; 
     int rows = 20; 
     double[][] values = new double[cols][rows]; 
     XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 
     XYSeries series = new XYSeries("Random"); 
     Random rand = new Random(); 
     for (int i = 0; i < values.length; i++) { 
      for (int j = 0; j < values[i].length; j++) { 
       double x = rand.nextGaussian(); 
       double y = rand.nextGaussian(); 
       series.add(x, y); 
      } 
     } 
     xySeriesCollection.addSeries(series); 
     return xySeriesCollection; 
    } 

    public static void main(String args[]) { 
     SPlotfinal scatterplotdemo4 = new SPlotfinal("Scatter Plot Demo 4"); 
     scatterplotdemo4.pack(); 
     RefineryUtilities.centerFrameOnScreen(scatterplotdemo4); 
     scatterplotdemo4.setVisible(true); 
    } 
} 
+0

謝謝..我會嘗試 – Sam

+1

['DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE'](http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/plot/DefaultDrawingSupplier.html#DEFAULT_SHAPE_SEQUENCE)也很方便。 – trashgod

+0

可以請你發佈上面的「ScatterPlotDemo」的代碼,這就是我正在尋找....感謝 – Sam

4

你可以得到圖(在這個例子中的一個XYPlot),然後渲染和改變基本形狀是這樣的:

// 5x5 red pixel circle 
Shape shape = new Ellipse2D.Double(0,0,5,5); 
XYPlot xyPlot = (XYPlot) jFreeCHart.getPlot(); 
XYItemRenderer renderer = xyPlot.getRenderer(); 
renderer.setBaseShape(shape); 
renderer.setBasePaint(Color.red); 

// set only shape of series with index i 
renderer.setSeriesShape(i, shape); 

你可以改變更多的事情,如輪廓漆/筆畫

+0

感謝您的建議 – Sam

+0

+爲簡單起見,雖然這會影響所有系列。 – trashgod

+0

我編輯我的答案來設置特定的系列 – timaschew