Jump to content
We've recently updated our Privacy Statement, available here ×

Ordering Series Legend in stacked bar chart


matthew.harrison
Go to solution Solved by matthew.harrison,

Recommended Posts

Hi, I've hit a bit of an issue, and am hopeful someone can give me some pointers on formatting my charts correctly.

What I'm doinf is producing a stacked bar chart, which is fine.  However the problem I'm having is that the Legend (showing the Series data) should be in a defined order.  In the SQL I can define the order, but this is for the Category, and then the Series, so for example if I get data that looks like this (I think - this is just made up data):

CategorySeriesValue
125
213
228
337

Then when the graph is shown the Category is sorted fine, but the Legend (showing the Series), would look like [2, 1, 3] in this case I believe - i.e. in the order that they come in in the data.

Is there a way to sort them in a customised way?

I did try putting 'dummy' data into the data set, so that the first record would have the correct sort order for the Categories, which sort of worked, but this gets messy fast I think.  So am I now looking at a customizer to get it sorted correctly?  If so any pointers would be appreciated.

Thanks in advance,

Matt

Link to comment
Share on other sites

  • Replies 1
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

  • Solution

I ended up finding an answer for this in the end.  If its of any use to people in the future, I created a chart customizer, which allowed me to define a property to define the legend labels:

import java.util.Iterator;import org.jfree.chart.JFreeChart;import org.jfree.chart.LegendItem;import org.jfree.chart.LegendItemCollection;import org.jfree.chart.plot.CategoryPlot;import net.sf.jasperreports.engine.JRAbstractChartCustomizer;import net.sf.jasperreports.engine.JRChart;import net.sf.jasperreports.engine.JRPropertiesMap;/** * Provides customisation of the chart display that are not possible with JasperReport properties. */public class ChartCustomiser extends JRAbstractChartCustomizer {	@Override	public void customize(final JFreeChart chart, final JRChart jasperChart) {		final String[] legendLabels = findLegendLabelProperty(jasperChart);		if (legendLabels.length > 0 && chart.getPlot() instanceof CategoryPlot) {			reorderLegendLabels(legendLabels, chart);		}	}	private void reorderLegendLabels(final String[] legendLabels, final JFreeChart chart) {		final LegendItemCollection newLegendItemCollection = new LegendItemCollection();		for (final String label : legendLabels) {			@SuppressWarnings("unchecked")			final Iterator existingLegendItemIterator = chart.getLegend().getSources()[0].getLegendItems().iterator();			while (existingLegendItemIterator.hasNext()) {				final LegendItem item = existingLegendItemIterator.next();				if (item.getDescription().equals(label)) {					newLegendItemCollection.add(item);					break;				}			}		}		if (newLegendItemCollection.getItemCount() > 0) {			((CategoryPlot) chart.getPlot()).setFixedLegendItems(newLegendItemCollection);		}	}	private String[] findLegendLabelProperty(final JRChart jasperChart) {		final JRPropertiesMap pm = jasperChart.getPropertiesMap();		final String legend = pm.getProperty("LegendLabels");		if (legend != null && !legend.isEmpty()) {			return legend.split("\|");		}		return new String[0];	}}[/code]This does mean if any items are missed from the LegendLabels property they don't get displayed, but it works for me.Hope this may be of use to someone if they hit the same issue, cheers,Matt
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...