Java – change the shape of the scatter point
•
Java
I have thousands of points on JfreeChart's scatter chart
//* I'm using shapeutilities, but when I use xyitemrenderer / xydotrenderer, it doesn't change the shape pointing to "daigonalcross" – if there are any errors in the code, please make any corrections.. *///
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,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); } }
Solution
Scatterrender inherits getitemshape() from 0700 You can override getitemshape () to provide your own shape
Appendix: one advantage of this method is that you can specify a shape for each item in each series
Appendix: to use shapeutilities Creatediagonalcross(), please do the following:
Shape cross = ShapeUtilities.createDiagonalCross(3,1); plot = (XYPlot) chart.getPlot(); renderer = plot.getRenderer(); renderer.setSeriesShape(0,cross);
Appendix: just switch to setseriesshape() Also, skip xydotrenderer and math round().
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",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); } }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码