在Series-JFreeChart中为特定行设置不同的颜色

我有一系列元素,它们属于一个系列,这些元素我计算了Centroids。 问题是当我用“ScatterPlot”显示它们时,我需要用“One Color”显示“Array Elements”,并在“Different Color”中显示这些点的Centroid。

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.DefaultDrawingSupplier; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.data.xy.DefaultXYDataset; import org.jfree.data.xy.XYDataset; public class Scatteradd extends JFrame { int i, x = 0, n1 = 0; public Scatteradd(String title, final double[][] samples) { super(title); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final DefaultXYDataset dataset = new DefaultXYDataset(); dataset.addSeries("Series0", createSeries(0, samples)); //dataset.addSeries("Series1", createSeries(1,trainingset3)); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(640, 480)); this.add(chartPanel, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); JButton addButton = new JButton("Add Series"); buttonPanel.add(addButton); addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int n = dataset.getSeriesCount(); System.out.println("N-SIZE" + n); dataset.addSeries("Series" + n, createSeries(n, samples)); System.exit(1); } }); JButton remButton = new JButton("Remove Series"); buttonPanel.add(remButton); remButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int n = dataset.getSeriesCount() - 1; dataset.removeSeries("Series" + n); } }); this.add(buttonPanel, BorderLayout.SOUTH); } /** * Create a series * @param samples * * @ return the series */ private double[][] createSeries(int mean, double[][] samples) { double[][] series = new double[2][samples.length + 1]; System.out.println("SSSKSKSValue" + series.length); double p = 0, q = 0; for (i = 0; i < samples.length; i++) { series[0][i] = samples[i][0]; p = p + samples[i][0]; series[1][i] = samples[i][1]; q = q + samples[i][1]; //System.out.println("Series Values"+series[0][i]+","+series[1][i]); } series[0][samples.length] = p / samples.length;//Centroid Calculation series[1][samples.length] = q / samples.length;//Centroid Calculation //Printing All Points in Series Array and the Last Row is the Centroid Values //which I want display in different Color on Scatter Plot for (int v = 0; v < series[0].length; v++) { System.out.println("Series Values" + series[0][v] + "," + series[1][v]); } return series; } private JFreeChart createChart(XYDataset dataset) { // create the chart... JFreeChart chart = ChartFactory.createScatterPlot( "Scatter Plot Demo", "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false); // set chart background chart.setBackgroundPaint(Color.white); // set a few custom plot features XYPlot plot = (XYPlot) chart.getPlot(); Shape[] cross = DefaultDrawingSupplier.createStandardSeriesShapes(); plot.setBackgroundPaint(new Color(0xffffe0)); plot.setDomainGridlinesVisible(true); plot.setDomainGridlinePaint(Color.lightGray); plot.setRangeGridlinePaint(Color.lightGray); XYItemRenderer renderer = (XYItemRenderer) plot.getRenderer(); renderer.setSeriesShape(0, cross[0]); plot.setRenderer(renderer); return chart; } /** Main method **/ public static void main(String[] args) { double[][] trainingset3 = { {0.428053, 0.409742,}, {0.415487, 0.401414,}, {0.404834, 0.400493,},}; Scatteradd demo = new Scatteradd("JFreeChartDemo", trainingset3); demo.pack(); demo.setLocationRelativeTo(null); demo.setVisible(true); } } 
 SSSKSKSValue2
系列值0.428053,0.409742
系列值0.415487,0.401414
系列值0.404834,0.400493
系列值0.4161246666666667,0.403883
 // 3行以上的质心

是否有任何方法可以显示具有不同颜色的系列中的特定行。有关此提供的任何示例都将是非常有用的。 谢谢

您可以在散点图的XYLineAndShapeRenderer覆盖getItemPaint ,并根据任何所需的rowcol组合选择颜色。 这里有一个相关的例子,虽然它是针对不同的渲染器。

附录:总体思路出现在MyRenderer ,它extends XYLineAndShapeRenderer

散点图自定义渲染器图像

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Paint; import java.awt.Shape; import java.util.Arrays; import javax.swing.JFrame; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.DefaultDrawingSupplier; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.DefaultXYDataset; import org.jfree.data.xy.XYDataset; public class ScatterColors extends JFrame { private static final Color centroidColor = Color.blue; private int centroidColumn; public ScatterColors(String title, final double[][] samples) { super(title); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DefaultXYDataset dataset = new DefaultXYDataset(); dataset.addSeries("Series", createSeries(0, samples)); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(500, 400)); this.add(chartPanel, BorderLayout.CENTER); } private double[][] createSeries(int mean, double[][] samples) { centroidColumn = samples.length; double[][] series = new double[2][samples.length + 1]; double p = 0, q = 0; for (int i = 0; i < samples.length; i++) { series[0][i] = samples[i][0]; p = p + samples[i][0]; series[1][i] = samples[i][1]; q = q + samples[i][1]; } series[0][samples.length] = p / samples.length; series[1][samples.length] = q / samples.length; for (int i = 0; i < series.length; i++) { System.out.println(Arrays.toString(series[i])); } return series; } private JFreeChart createChart(XYDataset dataset) { JFreeChart chart = ChartFactory.createScatterPlot( "Scatter Plot Demo", "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false); chart.setBackgroundPaint(Color.white); XYPlot plot = (XYPlot) chart.getPlot(); Shape[] cross = DefaultDrawingSupplier.createStandardSeriesShapes(); plot.setBackgroundPaint(new Color(0xffffe0)); plot.setDomainGridlinesVisible(true); plot.setDomainGridlinePaint(Color.lightGray); plot.setRangeGridlinePaint(Color.lightGray); MyRenderer renderer = new MyRenderer(false, true); plot.setRenderer(renderer); renderer.setSeriesShape(0, cross[0]); plot.setRenderer(renderer); return chart; } private class MyRenderer extends XYLineAndShapeRenderer { public MyRenderer(boolean lines, boolean shapes) { super(lines, shapes); } @Override public Paint getItemPaint(int row, int col) { if (col == centroidColumn) { return centroidColor; } else { return super.getItemPaint(row, col); } } } public static void main(String[] args) { double[][] trainingSet = { {0.428053, 0.409742,}, {0.415487, 0.401414,}, {0.404834, 0.400493,}, }; ScatterColors demo = new ScatterColors("JFreeChartDemo", trainingSet); demo.pack(); demo.setLocationRelativeTo(null); demo.setVisible(true); } }