当前位置: 首页 > 知识库问答 >
问题:

用JFreechart(bar,XY)绘制多重图

曾成天
2023-03-14

你好,我必须做一个程序来显示功率曲线,因此我需要在一个窗口上显示三个不同的图。不同类型的图是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;
}
}

共有1个答案

羊舌诚
2023-03-14

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

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

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

 类似资料:
  • 在JFreechart xySeries中,我希望使用非常密集的点集来绘制直线,以便精确地显示曲线,但是,我希望使用密度较小的点来绘制直线。例如,我有100个数据点,每个数据点在x轴上相距1个单位,但我只想每5个单位绘制一个点。但是,我希望每1个单位连接一条线,以显示高密度的曲线。这可能吗?

  • 我需要绘制磁滞回线,然后计算回线内闭合的面积。我正在使用JFreeChart。 考虑以下数据: 当我尝试: 我想区别在于点的连接方式。请指导如何用jFreeChart获得所需的磁滞回线,然后如何计算封闭面积。 谢谢

  • 我想画一些垂直线来跟踪任务,如下图中的红线所示。我相信可以使用甘特图绘制器绘制线条。 我想要的是在绘制任务期间存储直线endpoint的坐标,然后最终在绘图中绘制这些直线。 我想知道是否有一种方法可以让你在绘图上绘制任何东西,以及这是否是解决这个问题的正确方法。 以下是我的甘特图渲染器代码: 更新: 似乎LineAnnotics是实现这些行的最佳方式。Link1

  • 我用JFreeChart来表示我的x和y数组。这些数组被绘制得很好,但是回归线被破坏了,永远也不会被绘制出来。除了和函数之外,所有函数都可以工作,例如打印值。不知怎的,这两个都不起作用。我不太介意,但我喜欢能够。我的阵列具有正确的数据,因此不确定问题出在哪里。我正在函数中将数组数据导入数据集。我的具有和阵列。它们有和数据类型。

  • 问题内容: 有没有人使用JFreeChart开源库来绘制xy图? 有人可以发布一个示例,说明如何使用程序生成的x和y值动态创建xy图吗? 在哪里可以得到一份turorial文档或类似的东西,以了解如何使用JFreeChart开发应用程序? 提前致谢.. 问题答案: 您是否尝试过查看JFreeChart演示?看这里。 如果找到适合您需要的示例,则在Google中搜索演示的名称通常会从(例如)Kode

  • 我希望能够拖动绘图区域,以便能够移动x轴。 这可能吗?