Setting Different Color to particular Row in Series-JFreeChart

前端 未结 1 885
离开以前
离开以前 2020-12-03 16:34

I have array of elements and they belong to one Series,with these elements I calculated Centroids. Problem is when I display them with \"ScatterPlot\" I need to show \"Array

1条回答
  •  隐瞒了意图╮
    2020-12-03 16:52

    You can override getItemPaint in the scatter plot's XYLineAndShapeRenderer and choose your color based on any desired combination of row and col. There's a related example here, although it's for a different renderer.

    Addendum: The general idea appears in MyRenderer, which extends XYLineAndShapeRenderer.

    Scatter plot custom renderer image

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

    0 讨论(0)
提交回复
热议问题