使用JFreeChart在XYPlot中创建多个系列的问题 [英] Problems with creating multiple series in XYPlot with JFreeChart

查看:127
本文介绍了使用JFreeChart在XYPlot中创建多个系列的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下示例代码仅创建一个数据系列的图形。另外两个数据系列将不会被创建。



main() - 方法包含数据系列。

  import java.awt。*; 
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import javax.swing。*;

public class MultipleChartFactory {
private XYPlot plot;

私人ChartPanel chartPanel;

// datasetIndex用于多个数据集
private int datasetIndex = 0;
private ArrayList< XYSeriesCollection> seriesArrayList = new ArrayList< XYSeriesCollection>();

public MultipleChartFactory(String title,String xAxis){
super();
String yAxis = title;

XYSeriesCollection dataset = createDataset(Series);
JFreeChart图= ChartFactory.createXYLineChart(,xAxis,yAxis,dataset,PlotOrientation.VERTICAL,false,false,false);
chart.setBackgroundPaint(Color.white);

plot = chart.getXYPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);

ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);

NumberAxis rangeAxis2 = new NumberAxis(Range Axis 2);
rangeAxis2.setAutoRangeIncludesZero(false);

JPanel content = new JPanel(new BorderLayout());
chartPanel = new ChartPanel(图表);
content.add(chartPanel);
}

private XYSeriesCollection createDataset(String name){
XYSeries series = new XYSeries(name);

返回新的XYSeriesCollection(系列);
}

public ChartPanel getChart(){
return chartPanel;
}

public void createAdditionalDataset(){
seriesArrayList.add(createDataset(S+ this.datasetIndex));

this.datasetIndex ++;
this.plot.setDataset(
this.datasetIndex,seriesArrayList.get(0));
this.plot.setRenderer(this.datasetIndex,new StandardXYItemRenderer());
}

public XYSeriesCollection getXYSeries(int datasetIndex){
return seriesArrayList.get(datasetIndex);
}

public int getDatasetCount(){
return this.plot.getDatasetCount();
}

public static void main(String [] args)throws InterruptedException {
MultipleChartFactory mcf = new MultipleChartFactory(Battery,Time);

JFrame frame = new JFrame();
frame.setSize(700,700);
JPanel panel = new JPanel();
panel.add(mcf.getChart());
frame.add(panel);
frame.setVisible(true);

//关闭窗口
frame.addWindowListener(new WindowAdapter(){
public synchronized void windowClosing(WindowEvent we){
System.exit(0);
}
});

mcf.createAdditionalDataset();
mcf.createAdditionalDataset();
mcf.createAdditionalDataset();
mcf.getXYSeries(0).getSeries(0).add(1,10);
mcf.getXYSeries(0).getSeries(0).add(2,100);
Thread.sleep(3000);
System.out.println(first);
mcf.getXYSeries(1).getSeries(0).add(1,20);
mcf.getXYSeries(1).getSeries(0).add(2,200);
Thread.sleep(3000);
System.out.println(second);
mcf.getXYSeries(2).getSeries(0).add(1,30);
mcf.getXYSeries(2).getSeries(0).add(2,300);
}
}

调试器在 mcf后停止。 getXYSeries(0).getSeries(0).add(1,10); 。我不太明白为什么它停在那里。



你有建议在图表中显示每个数据系列吗?

解决方案

在访问 seriesArrayList 时,需要使用 datasetIndex

  public void createAdditionalDataset(){
seriesArrayList.add(createDataset(S+ this.datasetIndex));
this.plot.setDataset(this.datasetIndex,seriesArrayList.get(datasetIndex));
this.plot.setRenderer(this.datasetIndex,new StandardXYItemRenderer());
this.datasetIndex ++;
}

B


$ b

程序到界面,例如列表< XYSeriesCollection>


  • 使用 pack()在封闭的窗口上获取组件的首选大小。


  • 另请参见 初始主题




  • SSCCE:

      import java.awt.BorderLayout; 
    import java.awt.Color;
    import java.util.ArrayList;
    import java.util.List;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;

    import javax.swing。*;

    public class MultipleChartFactory {

    private XYPlot plot;
    私人ChartPanel chartPanel;
    private int datasetIndex = 0;
    私人列表< XYSeriesCollection> seriesArrayList = new ArrayList< XYSeriesCollection>();

    public MultipleChartFactory(String title,String xAxis){
    super();
    String yAxis = title;
    XYSeriesCollection dataset = createDataset(Series);
    JFreeChart图= ChartFactory.createXYLineChart(,xAxis,yAxis,
    数据集,PlotOrientation.VERTICAL,false,false,false);
    chart.setBackgroundPaint(Color.white);
    plot = chart.getXYPlot();
    plot.setBackgroundPaint(Color.lightGray);
    plot.setDomainGridlinePaint(Color.white);
    plot.setRangeGridlinePaint(Color.white);
    ValueAxis axis = plot.getDomainAxis();
    axis.setAutoRange(true);
    NumberAxis rangeAxis2 = new NumberAxis(Range Axis 2);
    rangeAxis2.setAutoRangeIncludesZero(false);
    JPanel content = new JPanel(new BorderLayout());
    chartPanel = new ChartPanel(图表);
    content.add(chartPanel);
    }

    private XYSeriesCollection createDataset(String name){
    XYSeries series = new XYSeries(name);
    返回新的XYSeriesCollection(系列);
    }

    public ChartPanel getChart(){
    return chartPanel;
    }

    public void createAdditionalDataset(){
    seriesArrayList.add(createDataset(S+ this.datasetIndex));
    this.plot.setDataset(this.datasetIndex,seriesArrayList.get(datasetIndex));
    this.plot.setRenderer(this.datasetIndex,new StandardXYItemRenderer());
    this.datasetIndex ++;
    }

    public XYSeriesCollection getXYSeries(int datasetIndex){
    return seriesArrayList.get(datasetIndex);
    }

    public int getDatasetCount(){
    return this.plot.getDatasetCount();
    }

    public static void main(String [] args)throws InterruptedException {
    MultipleChartFactory mcf = new MultipleChartFactory(Battery,Time);
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    panel.add(mcf.getChart());
    fram.add(panel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    mcf.createAdditionalDataset();
    mcf.createAdditionalDataset();
    mcf.createAdditionalDataset();
    mcf.getXYSeries(0).getSeries(0).add(1,10);
    mcf.getXYSeries(0).getSeries(0).add(2,100);
    System.out.println(first);
    mcf.getXYSeries(1).getSeries(0).add(1,20);
    mcf.getXYSeries(1).getSeries(0).add(2,200);
    System.out.println(second);
    mcf.getXYSeries(2).getSeries(0).add(1,30);
    mcf.getXYSeries(2).getSeries(0).add(2,300);
    }
    }


    The following example code creates a graph with only one data series. The other two data series will not be created.

    The main()-methods contains the data series.

    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.ArrayList;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
    import org.jfree.data.xy.XYDataset;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
    
    import javax.swing.*;
    
    public class MultipleChartFactory {
        private XYPlot plot;
    
        private ChartPanel chartPanel;
    
        // datasetIndex is used for multiple datasets
        private int datasetIndex = 0;
        private ArrayList<XYSeriesCollection> seriesArrayList = new ArrayList<XYSeriesCollection>();
    
        public MultipleChartFactory(String title, String xAxis) {
            super();
            String yAxis = title;
    
            XYSeriesCollection dataset = createDataset("Series");
            JFreeChart chart = ChartFactory.createXYLineChart("", xAxis, yAxis, dataset, PlotOrientation.VERTICAL, false, false, false);
            chart.setBackgroundPaint(Color.white);
    
            plot = chart.getXYPlot();
            plot.setBackgroundPaint(Color.lightGray);
            plot.setDomainGridlinePaint(Color.white);
            plot.setRangeGridlinePaint(Color.white);
    
            ValueAxis axis = plot.getDomainAxis();
            axis.setAutoRange(true);
    
            NumberAxis rangeAxis2 = new NumberAxis("Range Axis 2");
            rangeAxis2.setAutoRangeIncludesZero(false);
    
            JPanel content = new JPanel(new BorderLayout());
            chartPanel = new ChartPanel(chart);
            content.add(chartPanel);
        }
    
        private XYSeriesCollection createDataset(String name) {
            XYSeries series = new XYSeries(name);
    
            return new XYSeriesCollection(series);
        }
    
        public ChartPanel getChart() {
            return chartPanel;
        }
    
        public void createAdditionalDataset() {
            seriesArrayList.add(createDataset("S" + this.datasetIndex));
    
            this.datasetIndex++;
            this.plot.setDataset(
                    this.datasetIndex, seriesArrayList.get(0));
            this.plot.setRenderer(this.datasetIndex, new StandardXYItemRenderer());
        }
    
        public XYSeriesCollection getXYSeries(int datasetIndex) {
            return seriesArrayList.get(datasetIndex);
        }
    
        public int getDatasetCount() {
            return this.plot.getDatasetCount();
        }
    
        public static void main(String [] args) throws InterruptedException {
            MultipleChartFactory mcf = new MultipleChartFactory("Battery","Time");
    
            JFrame frame = new JFrame();
            frame.setSize(700, 700);
            JPanel panel = new JPanel();
            panel.add(mcf.getChart());
            frame.add(panel);
            frame.setVisible(true);
    
            // on closing window
            frame.addWindowListener(new WindowAdapter() {
                public synchronized void windowClosing(WindowEvent we) {
                    System.exit(0);
                }
            });
    
            mcf.createAdditionalDataset();
            mcf.createAdditionalDataset();
            mcf.createAdditionalDataset();
            mcf.getXYSeries(0).getSeries(0).add(1, 10);
            mcf.getXYSeries(0).getSeries(0).add(2, 100);
            Thread.sleep(3000);
            System.out.println("first");
            mcf.getXYSeries(1).getSeries(0).add(1, 20);
            mcf.getXYSeries(1).getSeries(0).add(2, 200);
            Thread.sleep(3000);
            System.out.println("second");
            mcf.getXYSeries(2).getSeries(0).add(1, 30);
            mcf.getXYSeries(2).getSeries(0).add(2, 300);
        }
    }
    

    Debugger stops after mcf.getXYSeries(0).getSeries(0).add(1, 10);. I am not really understanding why it stops there.

    Do you have suggestion to display every data series in the graph?

    解决方案

    You need to use the datasetIndex when acessing the seriesArrayList.

    public void createAdditionalDataset() {
        seriesArrayList.add(createDataset("S" + this.datasetIndex));
        this.plot.setDataset(this.datasetIndex, seriesArrayList.get(datasetIndex));
        this.plot.setRenderer(this.datasetIndex, new StandardXYItemRenderer());
        this.datasetIndex++;
    }
    

    Notes:

    • Program to the interface, e.g. List<XYSeriesCollection>.

    • Use pack() on the enclosing Window to obtain the preferred size of components.

    • See also Initial Threads.

    SSCCE:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.util.ArrayList;
    import java.util.List;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
    
    import javax.swing.*;
    
    public class MultipleChartFactory {
    
        private XYPlot plot;
        private ChartPanel chartPanel;
        private int datasetIndex = 0;
        private List<XYSeriesCollection> seriesArrayList = new ArrayList<XYSeriesCollection>();
    
        public MultipleChartFactory(String title, String xAxis) {
            super();
            String yAxis = title;
            XYSeriesCollection dataset = createDataset("Series");
            JFreeChart chart = ChartFactory.createXYLineChart("", xAxis, yAxis,
                dataset, PlotOrientation.VERTICAL, false, false, false);
            chart.setBackgroundPaint(Color.white);
            plot = chart.getXYPlot();
            plot.setBackgroundPaint(Color.lightGray);
            plot.setDomainGridlinePaint(Color.white);
            plot.setRangeGridlinePaint(Color.white);
            ValueAxis axis = plot.getDomainAxis();
            axis.setAutoRange(true);
            NumberAxis rangeAxis2 = new NumberAxis("Range Axis 2");
            rangeAxis2.setAutoRangeIncludesZero(false);
            JPanel content = new JPanel(new BorderLayout());
            chartPanel = new ChartPanel(chart);
            content.add(chartPanel);
        }
    
        private XYSeriesCollection createDataset(String name) {
            XYSeries series = new XYSeries(name);
            return new XYSeriesCollection(series);
        }
    
        public ChartPanel getChart() {
            return chartPanel;
        }
    
        public void createAdditionalDataset() {
            seriesArrayList.add(createDataset("S" + this.datasetIndex));
            this.plot.setDataset(this.datasetIndex, seriesArrayList.get(datasetIndex));
            this.plot.setRenderer(this.datasetIndex, new StandardXYItemRenderer());
            this.datasetIndex++;
        }
    
        public XYSeriesCollection getXYSeries(int datasetIndex) {
            return seriesArrayList.get(datasetIndex);
        }
    
        public int getDatasetCount() {
            return this.plot.getDatasetCount();
        }
    
        public static void main(String[] args) throws InterruptedException {
            MultipleChartFactory mcf = new MultipleChartFactory("Battery", "Time");
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel();
            panel.add(mcf.getChart());
            frame.add(panel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
    
            mcf.createAdditionalDataset();
            mcf.createAdditionalDataset();
            mcf.createAdditionalDataset();
            mcf.getXYSeries(0).getSeries(0).add(1, 10);
            mcf.getXYSeries(0).getSeries(0).add(2, 100);
            System.out.println("first");
            mcf.getXYSeries(1).getSeries(0).add(1, 20);
            mcf.getXYSeries(1).getSeries(0).add(2, 200);
            System.out.println("second");
            mcf.getXYSeries(2).getSeries(0).add(1, 30);
            mcf.getXYSeries(2).getSeries(0).add(2, 300);
        }
    }
    

    这篇关于使用JFreeChart在XYPlot中创建多个系列的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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