2013-09-13 5 views
2

Здравствуйте, я должен сделать программу для отображения кривых мощности, и поэтому мне нужно отобразить три разных графика в одном окне. Разные сюжеты - это XY (только точки), бар и XY с линиями.Нарисуйте многократный график с JFreechart (bar, XY)

Мои проблемы: как-то я могу получить только две диаграммы, чтобы нарисоваться И я не могу правильно изменить цвета отдельной диаграммы.

EDIT: Когда я ставлю в качестве комментария объявление третьего графика, второй, наконец, нарисован. Невозможно ли рисовать три диаграммы?

Любая помощь будет принята с благодарностью, спасибо;)

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; 
} 
} 

ответ

4

У вас есть два набора данных, в то же индекса в пределах участка - убедитесь, что вы настройки каждого набора данных уникальный индекс:

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

После этого я проверил ваш пример с некоторыми тестовыми данными и смог отобразить все три набора данных.

+0

Большое спасибо, он работает отлично: D Не знал, что есть индекс. – trolologuy

Смежные вопросы