JFreeChart: задаване на цветове на линии за XY диаграма - 4 серии, 2 набора от данни, двойни оси

Изглежда не мога да задам индивидуални цветове на линиите за всичките четири линии. Когато използвам редовете:

plot.getRenderer().setSeriesPaint(0, new Color(0x00, 0xFF, 0x00));
plot.getRenderer().setSeriesPaint(1, new Color(0x00, 0x00, 0x00));

(В кода по-долу), той прилага първия ред към ПЪРВАТА серия в ДВАТА набора от данни, а вторият ред към ВТОРАТА серия в ДВАТА набора от данни.

Как мога да задам различен цвят за всичките 4 линии?

Благодаря!

private JFreeChart createXYLineChart(String title) {
    XYDataset dataset1 = createXYVoltageDataset();
    XYDataset dataset2 = createXYCurrentDataset();

    JFreeChart chart = ChartFactory.createXYLineChart("Profile", "Set Current", "Voltage", null);
    XYPlot plot = (XYPlot) chart.getPlot(); 
    plot.setDataset(0, dataset1);
    plot.setDataset(1, dataset2);

    plot.setRangeAxis(1, new NumberAxis("Actual Current")); 
    plot.mapDatasetToRangeAxis(1, 1); //2nd dataset to 2nd y-axi

    plot.setBackgroundPaint(new Color(0xFF, 0xFF, 0xFF));
    plot.setDomainGridlinePaint(new Color(0x00, 0x00, 0xff));
    plot.setRangeGridlinePaint(new Color(0xff, 0x00, 0x00));

    plot.getRenderer().setSeriesPaint(0, new Color(0x00, 0xFF, 0x00));
    plot.getRenderer().setSeriesPaint(1, new Color(0x00, 0x00, 0x00));
    //plot.getRenderer().setSeriesPaint(2, new Color(0xFF, 0x00, 0x00)); // Does nothing
    //plot.getRenderer().setSeriesPaint(3, new Color(0x00, 0x00, 0xFF)); // Does nothing
    //plot.getRenderer(1).setSeriesPaint(3, new Color(0x00, 0x00, 0xFF)); // Null pointer exceptiopn

    return chart;
}

private  XYDataset createXYVoltageDataset() {
    final XYSeries s1 = new XYSeries("Min Voltage");
    final XYSeries s2 = new XYSeries("Max Voltage");
    for (int i = 0; i < profile.getNumSteps(); i++) s1.add(i, profile.getStepMinVoltage(i));
    for (int i = 0; i < profile.getNumSteps(); i++) s2.add(i, profile.getStepMaxVoltage(i));
    XYSeriesCollection dataset = new XYSeriesCollection();
    dataset.addSeries(s1);
    dataset.addSeries(s2);
    return dataset;
}
private  XYDataset createXYCurrentDataset() {
    final XYSeries s1 = new XYSeries("Min Current");
    final XYSeries s2 = new XYSeries("Max Current");
    for (int i = 0; i < profile.getNumSteps(); i++){
        s1.add(i, profile.getStepMinCurrent(i));
    }
    for (int i = 0; i < profile.getNumSteps(); i++) s2.add(i, profile.getStepMaxCurrent(i));
    XYSeriesCollection dataset = new XYSeriesCollection();
    dataset.addSeries(s1);
    dataset.addSeries(s2);
    return dataset;
}

person CL22    schedule 29.01.2014    source източник


Отговори (2)


Това беше окончателното ми решение:

XYDataset dataset1 = createXYVoltageDataset();
XYDataset dataset2 = createXYCurrentDataset();

XYLineAndShapeRenderer r1 = new XYLineAndShapeRenderer();
r1.setSeriesPaint(0, new Color(0xff, 0xff, 0x00)); 
r1.setSeriesPaint(1, new Color(0x00, 0xff, 0xff)); 
r1.setSeriesShapesVisible(0,  false);
r1.setSeriesShapesVisible(1,  false);

XYLineAndShapeRenderer r2 = new XYLineAndShapeRenderer();
r2.setSeriesPaint(0, new Color(0xff, 0x00, 0x00)); 
r2.setSeriesPaint(1, new Color(0x00, 0xff, 0x00)); 
r2.setSeriesShapesVisible(0,  false);
r2.setSeriesShapesVisible(1,  false);

JFreeChart chart = ChartFactory.createXYLineChart("Profile", "Set Current", "Voltage", null);
XYPlot plot = (XYPlot) chart.getPlot(); 

plot.setDataset(0, dataset1);
plot.setRenderer(0, r1);

plot.setDataset(1, dataset2);
plot.setRenderer(1, r2);

plot.setRangeAxis(1, new NumberAxis("Actual Current")); 
plot.mapDatasetToRangeAxis(1, 1); //2nd dataset to 2nd y-axi

plot.setBackgroundPaint(new Color(0xFF, 0xFF, 0xFF));
plot.setDomainGridlinePaint(new Color(0x00, 0x00, 0xff));
plot.setRangeGridlinePaint(new Color(0xff, 0x00, 0x00));

return chart;
person CL22    schedule 30.01.2014

Щях да създам свой собствен сюжет и два рендера, с new вместо chart.getPlot() или plot.getRenderer(). Ще се опитам да дам пример, подобен на вашия код, за да видите какво имам предвид; ще трябва да го коригирате, за да отговаря на вашите нужди:

 private JFreeChart createChart(String title) {
    XYDataset dataset1 = createDataset1();
    XYDataset dataset2 = createDataset2();

    XYBarRenderer renderer1 = new XYBarRenderer(0.20000000000000001D);
    renderer1.setSeriesPaint(0, Color.BLUE);
    renderer1.setSeriesPaint(1, Color.red);
    DateAxis domainAxis = new DateAxis("Date");
    NumberAxis valueAxis = new NumberAxis("Value");
    XYPlot plot = new XYPlot(dataset1, domainAxis, valueAxis, renderer1);

    StandardXYItemRenderer renderer2 = new StandardXYItemRenderer();
    renderer2.setSeriesPaint(0, Color.CYAN);
    renderer2.setSeriesPaint(1, Color.YELLOW);

    plot.setDataset(1, dataset2);
    plot.setRenderer(1, renderer2);

    JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, true);

    return chart;
}

РЕДАКТИРАНЕ: Между другото, ако използвате JFreeChart често, бих препоръчал да закупите ръководството. Освен PDF, който е доста полезен, получавате източника за всички примери в демонстрационния център, а това е безценно.

person Jannis Alexakis    schedule 29.01.2014