2011-07-12 16 views
9

JFreeChart dağılım grafiğinde arsa oluşturmak için binlerce noktam var. Sorun şu ki, programım "kareler" ile noktaları çizmek, fakat "kareler" den "nokta/daire" ye kadar Shape noktalarının nasıl değiştirileceğine dair yardıma ihtiyacım var. Herhangi bir yardım mutluluk duyacaktır.Dağılım grafiğinde nokta şekillerini değiştirme

// Ben ShapeUtilities kullanıyorum ama XYItemRenderer/XYDotRenderer için kullanma ettiğimde onun için "DaigonalCross" noktasının şeklini değiştirerek değil * - .. * Herhangi düzeltmeler kodunda anythng yanlışsa lütfen ///

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

cevap

17

bir ScatterRendererAbstractRenderer den getItemShape() devralır. Kendi şekillerinizi sağlamak için getItemShape()'u geçersiz kılabilirsiniz.

Ek: Bu yaklaşımın bir avantajı, her serideki her öğe için bir Shape belirtebilmenizdir.

Zeyilname:

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

Ek'ini: Böyle bir şey yapmak, ShapeUtilities.createDiagonalCross() kullanmak için sadece setSeriesShape() geçin. Ayrıca, XYDotRenderer ve Math.round()'u atlayın.

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

teşekkürler .. – Sam

+1

['DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE ']' ı (http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/plot/DefaultDrawingSupplier.html#DEFAULT_SHAPE_SEQUENCE) deneyebilirsiniz. . – trashgod

+0

Lütfen "ScatterPlotDemo" kodunun yukardaki kodunu gönderirsiniz. Tam olarak aradığım şey budur .... Teşekkürler – Sam

4

Sen (bu örnekte onun bir XYPlot için) arsa alabilir ve daha sonra işleyici ve bunun gibi baz şeklini değiştirmek: Sen çok daha şeyi değiştirebilirsiniz

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

[sscce] için anahat boya/strok

+0

önerileriniz için teşekkürler – Sam

+0

+1 basitlik için, bu tüm seriyi etkilese de. – trashgod

+0

Yanıtı özel seri – timaschew

İlgili konular