在Series-JFreeChart中为特定行设置不同的颜色 [英] Setting Different Color to particular Row in Series-JFreeChart

查看:124
本文介绍了在Series-JFreeChart中为特定行设置不同的颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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 Elements" with "One Color" and the Centroid of these points in "Different Color".

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

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

Is there any method to show particular row in a series with different Color,Any example provided regarding this would be great and helpful. Thanks

推荐答案

你可以覆盖 getItemPaint 在散点图的 XYLineAndShapeRenderer 中,根据山口。有一个相关的例子这里,虽然它适用于不同的渲染器。

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.

附录:总体思路出现在 MyRenderer ,其中扩展了XYLineAndShapeRenderer

Addendum: The general idea appears in MyRenderer, which 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);
    }
}

这篇关于在Series-JFreeChart中为特定行设置不同的颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆