改变散点图中点的形状

我有成千上万的点绘制JFreeChart散点图。 现在的问题是我的程序是用“正方形”来绘制点,但是我需要一些关于如何将点的Shape从“正方形”改变为“圆点/圆”的帮助。 任何帮助,将不胜感激。

// * 我正在使用ShapeUtilities,但是当我用于XYItemRenderer / XYDotRenderer时,它不会将点的形状改变为“DaigonalCross” – 如果在代码中有任何错误,请更正任何错误.. * ///

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

ScatterRendererAbstractRendererinheritancegetItemShape() 。 您可以重写getItemShape()来提供您自己的形状。

附录:这种方法的一个优点是,您可以为每个系列中的每个项目指定一个Shape

附录:使用ShapeUtilities.createDiagonalCross() ,做这样的事情:

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

附录:只需切换到setSeriesShape() 。 另外,跳过XYDotRendererMath.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", "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); } } 

你可以得到的情节(这个例子是一个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); 

你可以改变更多的东西,如轮廓油漆/中风