Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JFreeChart: set line colors for XY Chart - 4 series, 2 datasets, dual axes

I can't seem to set individual line colors for all four lines. When I use the lines:

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

(In the code below), it applies the first line to the FIRST series in BOTH datasets, and the second line to the SECOND series in BOTH datasets.

How can I set a different color for all 4 lines?

Thanks!

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;
}
like image 301
CL22 Avatar asked Jan 29 '14 10:01

CL22


2 Answers

This was my final solution:

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;
like image 136
CL22 Avatar answered Nov 10 '22 00:11

CL22


I´d create my own plot and two renderers, with new instead of chart.getPlot() or plot.getRenderer(). I´ll try to give an example similar to your code so you see what I mean ; you´ll have to adjust it to suit your needs:

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

EDIT: By the way, if you use JFreeChart often, I´d recommend buying the guide. Apart from the PDF which is pretty useful, you get the source for all examples in the demo center, and that is invaluable.

like image 38
Jannis Alexakis Avatar answered Nov 10 '22 01:11

Jannis Alexakis