java - 使用 JFreechart 绘制多重图(条形图,XY)

标签 java plot jfreechart

您好,我必须编写一个程序来显示功率曲线,因此我需要在一个窗口上显示三个不同的图。 不同类型的图有 XY(仅点)、条形图和带线的 XY。

我的问题:不知怎的,我只能绘制两个图表,而且我无法正确更改单个图表的颜色。

编辑:当我将第三个图表的声明作为注释时,第二个图表最终被绘制。画三张图表不可能吗?

任何帮助将不胜感激,谢谢;)

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;


public class OverlaidPlot extends ApplicationFrame 
{
   final XYSeries series0 = new XYSeries("Graph0");
   final XYSeries series1 = new XYSeries("Graph1");
   final XYSeries series2 = new XYSeries("Graph2");

   public OverlaidXYPlotDemo(final String title) 
    {
       super(title);
       final JFreeChart chart = createOverlaidChart();
       final ChartPanel panel = new ChartPanel(chart, true, true, true, true, true);
       panel.setPreferredSize(new java.awt.Dimension(800, 600));
       setContentPane(panel);
     }
 public void addElem0(double x, double y)
{
    this.series0.add(x, y);
}

public void addElem1(double x, double y)
{
    this.series1.add(x, y);
}

public void addElem2(double x, double y)
{
    this.series2.add(x, y);
}


private JFreeChart createOverlaidChart() 
{
    final NumberAxis domainAxis = new NumberAxis("Speed (m/s)");
    final ValueAxis rangeAxis = new NumberAxis("Power (kw)");

    // create plot ...
    final IntervalXYDataset data0 = createDataset0();
    final XYItemRenderer renderer0 = new XYBarRenderer(0.20);
    // change "new XYBarRenderer(0.20)" to "StandardXYItemRenderer()" if you want to change  type of graph
    final XYPlot plot = new XYPlot(data0, domainAxis, rangeAxis, renderer0);

    // add a second dataset and renderer... 
    final IntervalXYDataset data1 = createDataset1();
    final XYLineAndShapeRenderer renderer1 = new XYLineAndShapeRenderer(false, true); 
    // arguments of new XYLineAndShapeRenderer are to activate or deactivate the display of points or line. Set first argument to true if you want to draw lines between the points for e.g.
    plot.setDataset(1, data1);
    plot.setRenderer(1, renderer1);

    // add a third dataset and renderer... 
    final IntervalXYDataset data2 = createDataset2();
    final XYLineAndShapeRenderer renderer2 = new XYLineAndShapeRenderer(true, true); 
    // arguments of new XYLineAndShapeRenderer are to activate or deactivate the display of points or line. Set first argument to true if you want to draw lines between the points for e.g.
    plot.setDataset(1, data2);
    plot.setRenderer(1, renderer2);

    plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
    NumberAxis domain = (NumberAxis) plot.getDomainAxis();/*
    domain.setRange(0.00, 30);*/

    domain.setTickUnit(new NumberTickUnit(0.5));     
    domain.setVerticalTickLabels(true);
    // return a new chart containing the overlaid plot...
    return new JFreeChart("Test", JFreeChart.DEFAULT_TITLE_FONT, plot, true);

}

private IntervalXYDataset createDataset0() 
{
    // create dataset 0...
    final XYSeriesCollection coll0 = new XYSeriesCollection(series0);
    return coll0;
}

private IntervalXYDataset createDataset1() 
{
    // create dataset 1...
    final XYSeriesCollection coll1 = new XYSeriesCollection(series1);
    return coll1;
}

private IntervalXYDataset createDataset2() 
{
    // create dataset 2...
    final XYSeriesCollection coll2 = new XYSeriesCollection(series2);
    return coll2;
}
}

最佳答案

图中您有两个具有相同索引的数据集 - 确保将每个数据集设置为唯一的索引:

plot.setDataset(2, data2);
plot.setRenderer(2, renderer2);

更改此设置后,我使用一些测试数据运行了您的示例,并且能够看到绘制的所有三个数据集。

关于java - 使用 JFreechart 绘制多重图(条形图,XY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789343/

相关文章:

r - 更改轴标签中多条线之间的距离

java - 我如何根据时间或大小将 logback 配置为翻转,文件总数的绝对最大值?

java - appengine 数据存储区查询转义单引号 (')

python - 使用 MatPlotLib,如何将自动缩放 Axis 从一个图形应用到另一个图形?

r - 使用具有 3 个或更多类变量的 KSVM(kernlab)在 R 中创建二维图

java - JFreechart 中甘特图栏顶部的向下箭头

java - JFreeChart表格的X轴?

java - Spring Security 教程不适用于 Tomcat 服务器

java - 无法到达 OnClickListener 函数内的(最终)按钮

java - JFreeChart 支持这种类型的条形图吗?