我有一系列元素,它们属于一个系列,这些元素我计算了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 Series Values0.428053,0.409742 Series Values0.415487,0.401414 Series Values0.404834,0.400493 Series Values0.4161246666666667,0.403883 //Centroids of above 3 Rows
是否有任何方法可以显示具有不同颜色的系列中的特定行,有关此提供的任何示例都将非常有用。 感谢
答案 0 :(得分:9)
您可以在散点图的XYLineAndShapeRenderer
中覆盖getItemPaint
,并根据row
和col
的任意组合选择颜色。有一个相关的例子here,虽然它是针对不同的渲染器。
附录:总体思路出现在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);
}
}