2011-09-02 78 views
3

我有一组元素,它们属于一个系列,使用这些元素计算了质心。问题是当我用“ScatterPlot”显示它们时,需要用“One Color”显示“Array Elements”,并在“Different Color”中显示这些点的质心。将不同的颜色设置为系列中的特定行-JFreeChart

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 

有没有表现出特定的行与不同的颜色,提供了有关这将是巨大的和有益的任何例子一系列方法。 感谢

回答

8

您可以覆盖getItemPaint散点图的XYLineAndShapeRenderer,并选择基础上的rowcol任意组合你的颜色。有一个相关示例here,虽然它是用于不同的渲染器。

附录:总体思路出现在MyRenderer,其中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

@ trashgod.I已经通过你上面提到的例子不见了,上面我的重心是成对的值有参数的行和列,但在我的例子(0.4161246,0.403883)。其中意味着排是3但列是0和1 ...我怎样才能指定一列单列行..谢谢 – Sam

+0

对不起,请注意更新有关渲染。我没有关注数据集。你可以发布[sscce](http://sscce.org/)吗? – trashgod

+0

@trashgod.I添加代码请通过那..如果你可以帮我..: – Sam

相关问题