Добавление точек в XYSeries динамически с помощью JfreeChart - PullRequest
4 голосов
/ 26 августа 2011

У меня проблемы с добавлением точек в XYSeries.У меня есть два класса.Один - Sample (у него есть метод main), а другой класс - JfreeChart (у него есть JfreeChart код).В моем классе Sample у меня есть двумерный массив sample[row][2], который изначально имеет 10 строк, а затем мне нужно вызвать класс JfreeChart, добавить их в XYSeries и отобразить точечный график.Мне удалось это сделать, но в следующий раз, когда я вызову класс Jfreechart, в моем массиве будет 25 строк.

Мне нужно добавить значения в XYSeries и построить их на точечной диаграмме, которая должна отображать предыдущие 10значения строк с разными цветами, а теперь 25 значений строк с разными цветами ... и так далее.Кто-нибудь может дать некоторые предложения или примеры?

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) Когда я позвоню в класс JfreeChart «Первый раз», у меня будут эти пары в моем массиве выборок

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

2) Когда я вызову класс JfreeChart «Второй раз», в моем массиве выборок будут значения Diffrent (0,20,0,19) (0,8,0,79) (0,41,0.45)(0.77,0.79) (0.54,0.65)

И это происходит несколько раз (10 раз). Поэтому мне нужно добавить это к «XYSeries» и «XYSeriesCollection» и отобразить «First time» Values ​​и «Secondвремя "Значения, когда я вызываю Второй раз JFreeChart Class

1 Ответ

8 голосов
/ 26 августа 2011

Вы можете добавить новые значения к XYSeries, используя один из доступных методов add(), как показано в этом примере . Если вы получаете случайные строки, вам нужно опубликовать sscce .

Приложение: Если присмотреться к (недавно обновленному) генезису вашего примера, некоторая путаница понятна: массив вообще не нужен. В приведенном ниже примере есть кнопка, которая добавляет новые сэмплы ко второй серии.

Можно ли изменить цвет точек при нажатии кнопки «Добавить»?

Каждая новая серия имеет новый цвет, как показано в этом примере . Чтобы изменить отдельные цвета, рекомендуется переопределить метод визуализации 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);
            }
        });
    }
}
...