2011-07-12 14 views
9

Tengo miles de puntos para trazar en un diagrama de dispersión JFreeChart. El problema ahora es que mi programa está trazando puntos con "cuadrados", pero necesito ayuda sobre cómo cambiar el Shape de puntos de "cuadrados" a "puntos/círculos". Cualquier ayuda sería apreciada.Cambiar las formas de los puntos en el gráfico de dispersión

// * estoy usando ShapeUtilities, pero no es cambiar la forma de la punta, "DaigonalCross" cuando estoy usando para XYItemRenderer/XYDotRenderer - Cualquier corrección por favor, si anythng mal en el código .. * ///

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 para [sscce] (http://sscce.org/). – trashgod

Respuesta

17

Un ScatterRenderer hereda getItemShape() de AbstractRenderer. Puede anular getItemShape() para proporcionar sus propias formas.

Addendum: Una ventaja de este enfoque es que puede especificar Shape para cada elemento en cada serie.

Adición: Para utilizar ShapeUtilities.createDiagonalCross(), hacer algo como esto:

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

Adición: Simplemente acceda al setSeriesShape(). Además, omita el XYDotRenderer y el Math.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

gracias ... intentaré – Sam

+1

['DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE'] (http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/plot/DefaultDrawingSupplier.html#DEFAULT_SHAPE_SEQUENCE) es útil, también . – trashgod

+0

Puede publicar el código de arriba "ScatterPlotDemo", eso es exactamente lo que busco ... Gracias – Sam

4

Usted puede obtener la trama (para este ejemplo es un XYPlot) y luego el procesador y cambiar la forma de base como esto:

// 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); 

Puede cambiar muchas cosas más , como pintura de contorno/trazo

+0

gracias por las sugerencias – Sam

+0

+1 por simplicidad, aunque esto afecta a todas las series. – trashgod

+0

Edito mi respuesta para establecer series específicas – timaschew

Cuestiones relacionadas