Hi,
I'm trying to add a legend under the plot in scattered chart as shown below. Anyone knows if this is possible?
Before:
After:
Hi,
I'm trying to add a legend under the plot in scattered chart as shown below. Anyone knows if this is possible?
Before:
After:
This is controlled on the renderer:
XYPlot plot = (XYPlot) chart.getPlot();
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setBaseItemLabelsVisible(true);
Here's the custom label generator that I created:
public class LegendXYItemLabelGenerator extends StandardXYItemLabelGenerator
implements XYItemLabelGenerator, Cloneable, PublicCloneable,
Serializable {
private LegendItemCollection legendItems;
public LegendXYItemLabelGenerator(LegendItemCollection legendItems) {
super();
this.legendItems = legendItems;
}
@Override
public String generateLabel(XYDataset dataset, int series, int item) {
LegendItem legendItem = legendItems.get(series);
return legendItem.getLabel();
}
}
and then I added this code in addition to @Guilaume's code:
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelGenerator(new LegendXYItemLabelGenerator(plot.getLegendItems()));
and here's the result:
Extending StandardXYItemLabelGenerator
is often a useful approach, but the supplied constructors may suffice. For this generator, the MessageFormat
ArgumentIndex values correspond to the series name, domain and range.
NumberFormat format = NumberFormat.getNumberInstance();
format.setMaximumFractionDigits(2); // etc.
XYItemLabelGenerator generator =
new StandardXYItemLabelGenerator("{0} {1} {2}", format, format);
renderer.setBaseItemLabelGenerator(generator);
renderer.setBaseItemLabelsVisible(true);
In addition, you can control individual series labeling with
renderer.setSeriesItemLabelsVisible(true);