简体   繁体   English

使用JfreeChart动态地向XYSeries添加点

[英]Adding points to XYSeries dynamically with JfreeChart

I am facing problems in adding points to XYSeries. 我在向XYSeries添加点时遇到问题。 I have two classes. 我有两节课。 One is Sample (it has a main method) and the other class is JfreeChart (it has JfreeChart Code). 一个是Sample (它有一个main方法),另一个是JfreeChart (它有JfreeChart代码)。 In my Sample class I have a 2D array sample[row][2] which has initially 10 rows, and then I need to call the JfreeChart class and add them to XYSeries and display a scatter plot. 在我的Sample类中,我有一个2D数组sample[row][2] ,最初有10行,然后我需要调用JfreeChart类并将它们添加到XYSeries并显示散点图。 I managed to do this, but the next time I call the Jfreechart class my Array has 25 rows. 我设法做到了这一点,但下次我调用Jfreechart类时,我的Array有25行。

I need to add the values to XYSeries and plot them on a scatter plot which should display the earlier 10 rows' values with different colors and now 25 rows values with different colors… and this goes on. 我需要将值添加到XYSeries并在散点图上绘制它们,散点图应显示前面10行的不同颜色值,现在25行值不同颜色......这样就可以了。 Can anyone give some suggestions or examples? 谁能提出一些建议或例子?

class Sample {

    public static void main(String args[]) {
        System.out.print("(X,Y) Paired Values");
        double[][] sample = new double[row][2];

        for (int g = 0; g < sampe.length; g++) {
            for (int h = 0; h < 2; h++) {
                System.out.print("" + sample[g][h] + ",");
            }
        }
        JfreeChart sample = new JfreeChart("Demo", sample);
    }

    static XYDataset samplexydataset2(double[][] sample) {
        XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
        XYSeries series = new XYSeries("DataSet");
        for (int x = 0; x < sample.length; x++) {
            series.add(sample[x][0], sample[x][1]);
        }
        xySeriesCollection.addSeries(series);
        return xySeriesCollection;
    }
}

1)When I call "First Time" JfreeChart Class I will be having these Pairs in my Sample Array 1)当我打电话给“第一次”JfreeChart Class时,我将在我的Sample Array中使用这些Pairs

(0.78,0.80) (0.21,0.19) (0.181,0.187) (0.78,0.80)(0.21,0.19)(0.181,0.187)

2)When I call JfreeChart Class "Second time" I will having Diffrent values in my Sample Array (0.20,0.19) (0.8,0.79) (0.41,0.45) (0.77,0.79) (0.54,0.65) 2)当我调用JfreeChart类“第二次”时,我的样本数组中会有不同的值(0.20,0.19)(0.8,0.79)(0.41,0.45)(0.77,0.79)(0.54,0.65)

And this goes for few times(10 times)So I need add this to "XYSeries" and "XYSeriesCollection" and display the "First time" Values and "Second time" Values when I call Second time JFreeChart Class 这几次(10次)所以我需要将它添加到“XYSeries”和“XYSeriesCollection”并在我第二次调用JFreeChart类时显示“第一次”值和“第二次”值

You can add new values to the XYSeries using one of the available add() methods, as shown in this example . 您可以使用一个可用的add()方法向XYSeries添加新值,如本所示。 If you're getting adventitious rows, you'll need to post an sscce . 如果您正在获取偶然行,则需要发布sscce

Addendum: Looking more closely at the (recently updated) genesis of your example, some confusion is understandable: no array is needed at all. 附录:仔细观察你的例子的(最近更新的) 起源 ,一些混乱是可以理解的:根本不需要数组。 The example below includes a button that adds new samples to a second series. 下面的示例包含一个按钮,可以将新样本添加到第二个系列。

Can I change the Color of Points when I click the "Add" Button? 单击“添加”按钮可以更改点的颜色吗?

Each new series is a new color, as shown in this example . 每个新系列都是一种新颜色,如本所示。 To change individual colors, the recommended way is to override the renderer's getItemPaint() method, as shown here . 要改变个别颜色,推荐的方法是重写渲染器的getItemPaint()方法,见这里

ScatterAdd

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.*;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/questions/7205742
 * @see https://stackoverflow.com/questions/7208657
 * @see https://stackoverflow.com/questions/7071057
 */
public class ScatterAdd extends JFrame {

    private static final int N = 8;
    private static final String title = "Scatter Add Demo";
    private static final Random rand = new Random();
    private XYSeries added = new XYSeries("Added");

    public ScatterAdd(String s) {
        super(s);
        final ChartPanel chartPanel = createDemoPanel();
        this.add(chartPanel, BorderLayout.CENTER);
        JPanel control = new JPanel();
        control.add(new JButton(new AbstractAction("Add") {

            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < N; i++) {
                    added.add(rand.nextGaussian(), rand.nextGaussian());
                }
            }
        }));
        this.add(control, BorderLayout.SOUTH);
    }

    private ChartPanel createDemoPanel() {
        JFreeChart jfreechart = ChartFactory.createScatterPlot(
            title, "X", "Y", createSampleData(),
            PlotOrientation.VERTICAL, true, true, false);
        XYPlot xyPlot = (XYPlot) jfreechart.getPlot();
        xyPlot.setDomainCrosshairVisible(true);
        xyPlot.setRangeCrosshairVisible(true);
        XYItemRenderer renderer = xyPlot.getRenderer();
        renderer.setSeriesPaint(0, Color.blue);
        NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis();
        domain.setVerticalTickLabels(true);
        return new ChartPanel(jfreechart);
    }

    private XYDataset createSampleData() {
        XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
        XYSeries series = new XYSeries("Random");
        for (int i = 0; i < N * N; i++) {
            double x = rand.nextGaussian();
            double y = rand.nextGaussian();
            series.add(x, y);
        }
        xySeriesCollection.addSeries(series);
        xySeriesCollection.addSeries(added);
        return xySeriesCollection;
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ScatterAdd demo = new ScatterAdd(title);
                demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                demo.pack();
                demo.setLocationRelativeTo(null);
                demo.setVisible(true);
            }
        });
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM