Reporting without charting is like zombies without the inevitable hunt for fresh brains. You can do it, yes, but it is sure not fun.
These days, charting in Pentaho Reporting is done via the “chart-element” in the Pentaho Report Designer. Drag the chart field into the canvas, double click on it to open the chart-editor, and start configuring your chart.
So far it’s all theory, lets see how charting really works.
Architecture of Charting
Charting in the Pentaho Reporting engine requires three parts. It requires (1) a data-collector to extract the charting-data from the datasources, (2) a chart-expression to produce a chart from the collected data and (3) a report element to display the resulting chart object.
The chart element that you can drag into the report is a front-end to hold the data-collector and the chart-expression and – of course – is responsible for rendering the chart once it has been produced.
Each chart-type is produced by a separate chart-expression. The chart-editor dialog selects the right chart expression for you when you click on one of the chart-type buttons on the top of the window. The visual properties of the chart are configured on the left-hand side of the chart dialog.
Depending on the chart type, you will need a suitable chart-datacollector. Data-collectors are configured in the right-hand table of the dialog. The dialog only offers collectors that can produce valid datasets for the currently selected chart type.
Chart Types
The chart types the Pentaho Report Designer supports can be grouped into three different groups:
1. Categorical Charts
A categorical chart uses a nominal scale to group data. The charting system makes no assumptions on relationships between the data. The X-Axis of such charts display labels for each data point, and all datapoints are printed in the order they arrive at the data-collector.
You can use categorical charts to display nominal data. In statistics, the nominal scale is the lowest measurement level you can use. A nominal scale, as the name implies, is simply some placing of data into categories, without any order or structure.
A example of a nominal scale is the sales regions of a company. Regions have no real relationship or natural order between each other. One region is as good as an other (from a statistical point of view).
Pentaho Reporting supports the following categorical charts:
- Bar Chart
- Line Chart
- Area Chart
- Combined Bar and Line Chart
- Waterfall Charts
- Radar Charts
2. XY-Charts
A XY-Chart uses an interval scale to organize the data it displays. All data items are comparable and can be sorted and all data points have a defined distance between each others.
The most common example for a interval scale in the context of reporting is the date-axis for comparing events on a time scale. (sales over the last years).
Pentaho Reporting supports the following XY-Charts:
- Bar Chart
- Line Chart
- Area Chart
- Combined Bar and Line Chart
- Combined Area and Line Chart
- Scatter Plot Charts
- Bubble Charts
3. Pie and Ring charts
Pie charts can be used to compare the overall ratio of several numeric values. Your values must be complete (ie add up to 100% of what you want to show) or your chart will be misleading.
Pie charts should only be used if you are comparing the size of a slide with the overall size of the pie. However, this type of charts is not suitable for comparing the sizes of two slices or comparing different pie charts.
The Multi-Pie-Chart chart type should not be used at all. It only exists because some users insisted on this sort of functionality. But this sort of chart is hard to read at best and usually just plainly misleading.
Creating a categorical bar chart
Now, in the hands-on section of this entry, lets create a bar chart that shows the sales of our various product lines over the last few years. This example uses the sample data that comes with the Pentaho Report Designer.
Create a new report in the Report Designer and follow me.
First, You need data
Create a new JDBC datasource (Data->Add Datasource->JDBC). Select the predefined connection “SampleData(Memory)”, create a new query called “chart-data” and add the following query text.
SELECT PRODUCTS.PRODUCTLINE, ORDERFACT.YEAR_ID, sum(ORDERFACT.TOTALPRICE) AS SALES, sum(ORDERFACT.QUANTITYORDERED) AS VOLUME FROM PRODUCTS INNER JOIN ORDERFACT ON PRODUCTS.PRODUCTCODE = ORDERFACT.PRODUCTCODE GROUP BY PRODUCTS.PRODUCTLINE, ORDERFACT.YEAR_ID ORDER BY PRODUCTS.PRODUCTLINE ASC, ORDERFACT.YEAR_ID ASC
Make this query your currently active query: In the data-tab, expand the new JDBC data-source and right-click on the query node below and select “Select Query”.
Then you need a chart object
Drag the chart-object from from left hand palette into the report-header area. This ensures that the chart is printed once on the report. If you put a chart into the Group-header or -footer the chart is printed for each occurrence of that group. Putting a chart into the details band makes no sense. It would print the exact same chart as many times as there are rows in your data source.
And finally we need to configure the chart
Double click on the chart object to start the chart-editor. The “Bar Chart” should already be selected.
First, we define what data the chart will be using. On the right-hand side you find the chart-data collector. Enter the following values into the properties:
- Category Column: YEAR_ID
- Value Column: SALES
- Series-by-Field: PRODUCTLINE
A chart could have several series for each column, which can be useful if you want to compare data-series with each other.
Next define the chart’s appearance. For now, we keep it simple and just change the Chart’s title and the y-axis title.
- Chart Title: Product Line Sales Trend
- Y-Axis Title: Sales
Confirm the changes in the chart editor by pressing “OK” on the bottom of the dialog and preview your report.
You can find several chart examples in the samples that ship with the Pentaho Report Designer. Explore them!
We have been diligently attempting (albeit unsuccessfully) to use the Post-Processing Script facility to generate a dual-axis line chart from the PRD bar-line chart. Any suggestions?
Transforming a normal chart into a dual-Axis chart is black magic – so Kids, never try that at home.
For the “bar-line” into “line-line”: That is a bit easier. Something like:
[code]
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
CategoryPlot plot = chart.getCategoryPlot();
CategoryItemRenderer lineRenderer = new LineAndShapeRenderer();
plot.setRenderer(0, lineRenderer);
[code]
should do the trick.
The bad thing here is that you run into a error condition when the chart tries to configure itself in later report states. The BarLine-Chart unconditionally expects a BarRenderer in the first slot and thus dies a horrible death when it finds your LineRenderer there.
I think the post-processing needs a new flag that allows charts that are completely and utterly changed on every level. At the moment large structural changes are not possible.
This is probably worth a JIRA case!