【问题标题】:How do I eliminate a set of duplicate X values when plotting more than one function?绘制多个函数时如何消除一组重复的 X 值?
【发布时间】:2013-02-01 21:45:04
【问题描述】:

我是 jfreechart 的新手。我有像http://www.java2s.com/Code/Java/Chart/JFreeChartXYLogAxesDemo.htm 这样的代码,它在图表中绘制了 4 个函数。

但是,每个 xyseries 的 x 值都是相同的。这似乎是多余的。

有没有办法消除这些重复数据?

我宁愿生成一个 x 系列和许多 y 系列,然后将它们添加到某种系列集合中。

编辑:实现答案非常简单(请参见下文)。

但不确定如何处理 getSeriesKey()?

import java.util.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.AbstractXYDataset;
import org.jfree.ui.ApplicationFrame;
@SuppressWarnings("serial") class XYDatasetWithCommonX extends AbstractXYDataset {
    @SuppressWarnings("unchecked") XYDatasetWithCommonX(int n) {
        this.n=n;
        y=new ArrayList[n];
        for(int i=0;i<n;i++)
            y[i]=new ArrayList<Number>();
    }
    public void add(double x,double[] y) {
        this.x.add(x);
        for(int i=0;i<n;i++)
            this.y[i].add(y[i]);
    }
    @Override public int getSeriesCount() {
        return n;
    }
    @Override public Comparable getSeriesKey(int series) {
        return "Unit";
    }
    @Override public int getItemCount(int series) {
        return y[series].size();
    }
    @Override public Number getX(int series,int item) {
        return x.get(item);
    }
    @Override public Number getY(int series,int item) {
        return y[series].get(item);
    }
    final int n;
    final List<Number> x=new ArrayList<Number>();
    final List<Number>[] y;
}
@SuppressWarnings("serial") public class Main extends ApplicationFrame {
    Main() {
        super("demo");
    }
    public static void main(String[] args) {
        XYDatasetWithCommonX x=new XYDatasetWithCommonX(3);
        double[] y=new double[3];
        for(int i=1;i<=50;i++) {
            y[0]=10*Math.exp(i/5.0);
            y[1]=20*Math.exp(i/5.0);
            y[2]=30*Math.exp(i/5.0);
            x.add(i,y);
        }
        Main main=new Main();
        final JFreeChart chart=ChartFactory.createXYLineChart("my demo","x","y",x,PlotOrientation.VERTICAL,true,true,false);
        final ChartPanel chartPanel=new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500,270));
        main.setContentPane(chartPanel);
        main.pack();
        main.setVisible(true);
    }
}

【问题讨论】:

  • 您链接的示例绘制 3 系列,我在任何地方都看不到冗余值。你能详细说明一下吗?
  • 每个系列的 xvalues 都是重复序列。即 i 在三个语句中的每一个中,例如 s1.add(i, 10 * Math.exp(i / 5.0));是一样的

标签: java plot jfreechart


【解决方案1】:

这似乎是多余的。

是的,XYDatasetXYSeriesCollection 的选择实现只是众多具体实现之一。对于大量相同的域值,请考虑自定义 XYDataset,其中包含由所有系列共享的域值的单个 List&lt;Number&gt;。该方法在here 中针对单个系列进行了说明。

【讨论】:

  • 是的,看起来我可以继承 AbstractXYDataset 并按照您的建议进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多