2015-04-07 2 views
1

Я использую JFreeChart для построения двух серий данных (XYSeries) с использованием линейной диаграммы. Усложняющим фактором является то, что одна из рядов данных имеет значения у, которые обычно намного превышают значения у моих вторых рядов данных (скажем, что первая серия имеет значения у порядка порядка миллионов, тогда как вторая серия имеет y-значения порядка сотни). Существование высоких значений в моем первом наборе данных приводит к тому, что диапазон графика будет таким, чтобы значения y моего второго набора данных уже не были понятны.Установка другой оси y для двух серий с помощью JFreeChart

Добавление второй оси y к графику, так что обе мои серии данных используют свою собственную ось y, решает эту проблему. Кто-нибудь знает, как это сделать с JFreeChart?

Текущий код для полноты:

XYSeriesCollection dataset = new XYSeriesCollection(); 
XYSeries series1 = new XYSeries("series1"); 
XYSeries series2 = new XYSeries("series2"); 

// Here is my code to fill series1 and series2 with data  

dataset.addSeries(series1); 
dataset.addSeries(series2); 

JFreeChart chart = ChartFactory.createXYLineChart(
    "title", "x-axis title", "y-axis title", dataset, PlotOrientation.VERTICAL, true, true, false 
); 
chart.getXYPlot().setRenderer(new XYSplineRenderer()); 

ответ

6

Вы можете вручную создать объект JFreeChart вместо использования ChartFactory. Сначала создайте наборы данных и график, установив каждый набор данных в индекс. Затем вы можете настроить сюжет с необходимой осью и рендерером. Вот пример для этого с фиктивными данными, имеющими два набора данных, каждый с разными значениями y-значений:

//create the series - add some dummy data 
    XYSeries series1 = new XYSeries("series1"); 
    XYSeries series2 = new XYSeries("series2"); 
    series1.add(1000, 1000); 
    series1.add(1150, 1150); 
    series1.add(1250, 1250); 

    series2.add(1000, 111250); 
    series2.add(1150, 211250); 
    series2.add(1250, 311250); 

    //create the datasets 
    XYSeriesCollection dataset1 = new XYSeriesCollection(); 
    XYSeriesCollection dataset2 = new XYSeriesCollection(); 
    dataset1.addSeries(series1); 
    dataset2.addSeries(series2); 

    //construct the plot 
    XYPlot plot = new XYPlot(); 
    plot.setDataset(0, dataset1); 
    plot.setDataset(1, dataset2); 

    //customize the plot with renderers and axis 
    plot.setRenderer(0, new XYSplineRenderer());//use default fill paint for first series 
    XYSplineRenderer splinerenderer = new XYSplineRenderer(); 
    splinerenderer.setSeriesFillPaint(0, Color.BLUE); 
    plot.setRenderer(1, splinerenderer); 
    plot.setRangeAxis(0, new NumberAxis("Series 1")); 
    plot.setRangeAxis(1, new NumberAxis("Series 2")); 
    plot.setDomainAxis(new NumberAxis("X Axis")); 

    //Map the data to the appropriate axis 
    plot.mapDatasetToRangeAxis(0, 0); 
    plot.mapDatasetToRangeAxis(1, 1); 

    //generate the chart 
    JFreeChart chart = new JFreeChart("MyPlot", getFont(), plot, true); 
    chart.setBackgroundPaint(Color.WHITE); 
    JPanel chartPanel = new ChartPanel(chart); 
Смежные вопросы