2011-07-12 23 views
9

मेरे पास JFreeChart स्कैटर प्लॉट पर प्लॉट के हजारों अंक हैं। अभी समस्या यह है कि मेरा प्रोग्राम "वर्ग" के साथ बिंदुओं की साजिश कर रहा है, लेकिन मुझे "वर्ग" से "बिंदुओं/मंडलियों" के बिंदुओं के Shape को बदलने के तरीके पर कुछ मदद चाहिए। किसी भी मदद की सराहना की जाएगी।स्कैटर प्लॉट में अंक के आकार बदलना

// * मैं ShapeUtilities का उपयोग कर रहा है, लेकिन इसकी बिंदु के लिए "DaigonalCross" आकार बदल नहीं जब मैं XYItemRenderer/XYDotRenderer के लिए उपयोग कर रहा हूँ - कोई सुधार कृपया अगर कोड में 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/) के लिए +1। – trashgod

उत्तर

17

एक ScatterRendererAbstractRenderer से getItemShape() इनहेरिट करती है। आप अपना खुद का आकार देने के लिए getItemShape() ओवरराइड कर सकते हैं।

परिशिष्ट: इस दृष्टिकोण का एक लाभ यह है कि आप प्रत्येक श्रृंखला में प्रत्येक आइटम के लिए Shape निर्दिष्ट कर सकते हैं।

परिशिष्ट: ShapeUtilities.createDiagonalCross() का उपयोग करने के लिए, कुछ इस तरह करते हैं:

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

परिशिष्ट: बस setSeriesShape() पर स्विच करें। साथ ही, XYDotRenderer और 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

धन्यवाद .. मैं – 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

+1 के लिए धन्यवाद, हालांकि यह सभी श्रृंखलाओं को प्रभावित करता है। – trashgod

+0

मैं विशिष्ट श्रृंखला सेट करने के लिए अपना उत्तर संपादित करता हूं – timaschew

संबंधित मुद्दे