【问题标题】:Setting Different Color to particular Row in Series-JFreeChart为 Series-JFreeChart 中的特定行设置不同的颜色
【发布时间】:2011-09-02 13:09:59
【问题描述】:

我有一组元素,它们属于一个系列,我用这些元素计算了质心。问题是当我用“ScatterPlot”显示它们时,我需要用“一种颜色”显示“数组元素”,并用“不同颜色”显示这些点的质心。

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

    }
}
SSSKKS值2 系列值0.428053,0.409742 系列值0.415487,0.401414 系列值0.404834,0.400493 系列值0.4161246666666667,0.403883 //以上3行的质心

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

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    您可以覆盖散点图中的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);
        }
    }
    

    【讨论】:

    • @trashgod。我已经完成了您上面提到的示例,它的参数为行和列,但在我上面的示例中,我的质心是配对值(0.4161246,0.403883)。这意味着行是 3 但列是 0 和 1 ...如何为单行指定两列..谢谢
    • 抱歉,请注意有关渲染器的更新。我没有关注数据集;可以发sscce吗?
    • @trashgod.我添加了代码,请检查一下..看看你能不能帮助我..:
    • 修复编译错误后,我在createSeries() 中得到ArrayIndexOutOfBoundsException。
    • 我发布了带有程序输出的无错误代码。谢谢
    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多