3 votes

Définir une couleur différente pour une rangée particulière dans Series-JFreeChart

J'ai un tableau d'éléments qui appartiennent à une série, avec ces éléments j'ai calculé les centroïdes. Le problème est que lorsque je les affiche avec "ScatterPlot", j'ai besoin de montrer les "éléments du tableau" avec "une couleur" et le centroïde de ces points dans "une autre couleur".

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

Existe-t-il une méthode pour afficher une rangée particulière dans une série avec une couleur différente ? Tout exemple fourni à ce sujet serait formidable et utile. Merci

9voto

trashgod Points 136305

Vous pouvez passer outre getItemPaint dans le diagramme de dispersion XYLineAndShapeRenderer et choisissez votre couleur en fonction de n'importe quelle combinaison souhaitée de row y col . Il existe un exemple connexe aquí bien que ce soit pour un moteur de rendu différent.

Addendum : L'idée générale apparaît dans MyRenderer qui 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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X