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;
}
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;
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With