ZetCode

JasperReports scatter chart

last modified December 10, 2021

JasperReports scatter chart tutorial shows how to create a scatter chart in JasperReports library.

JasperReports is an open-source reporting library. It can create reports in various formats including PDF, HTML, XLS, or CSV.

Scatter chart uses Cartesian coordinates to display values for sets of numerical data, with one variable on each axis.

JasperReports scatter chart example

In the following example, we place a scatter chart into a report; the chart displays temperature values.

report.xml
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
            http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
        name="report" pageWidth="595" pageHeight="842" columnWidth="555"
        leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">

    <field name="id" class="java.lang.Long"/>
    <field name="date"/>
    <field name="val" class="java.lang.Double"/>

    <summary>
        <band height="450" splitType="Stretch">
            <scatterChart>
                <chart isShowLegend="true">
                    <reportElement x="0" y="0" width="450" height="400"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <xyDataset>
                    <dataset/>
                    <xySeries>
                        <seriesExpression><![CDATA[ "Temperatures" ]]></seriesExpression>
                        <xValueExpression><![CDATA[ $F{id} ]]></xValueExpression>
                        <yValueExpression><![CDATA[ $F{val} ]]></yValueExpression>
                    </xySeries>
                </xyDataset>
                <scatterPlot isShowLines="false" isShowShapes="true">
                    <plot backcolor="#959696" backgroundAlpha="0.1"/>
                    <xAxisFormat>
                        <axisFormat/>
                    </xAxisFormat>
                    <yAxisFormat>
                        <axisFormat/>
                    </yAxisFormat>
                </scatterPlot>
            </scatterChart>
        </band>
    </summary>
</jasperReport>

The scatter chart uses the scatterChart tag.

<field name="id" class="java.lang.Long"/>
<field name="date"/>
<field name="val" class="java.lang.Double"/>

There are three fields in the template. Fields are mapped to the elements of the data source. In the chart, we utilize the id and the val fields.

<xyDataset>
    <dataset/>
    <xySeries>
        <seriesExpression><![CDATA[ "Temperatures" ]]></seriesExpression>
        <xValueExpression><![CDATA[ $F{id} ]]></xValueExpression>
        <yValueExpression><![CDATA[ $F{val} ]]></yValueExpression>
    </xySeries>
</xyDataset>

On the x-axis, we put the ids and on the y-axis, we put the temperature values.

<scatterPlot isShowLines="false" isShowShapes="true">
    <plot backcolor="#959696" backgroundAlpha="0.1"/>
    <xAxisFormat>
        <axisFormat/>
    </xAxisFormat>
    <yAxisFormat>
        <axisFormat/>
    </yAxisFormat>
</scatterPlot>

In the scatterPlot, we can customize the chart a bit.

report.gvy
package com.zetcode

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.17.0')

import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
import groovy.transform.Immutable

@Immutable
class Temp {
    long id;
    String date;
    double val;
}

def data = [
    new Temp(1L, "Jan 1", -7.3),
    new Temp(2L, "Jan 10", -3.4),
    new Temp(3L, "Jan 12", -5.0),
    new Temp(4L, "Jan 20", -0.9),
    new Temp(5L, "Jan 30", -2.2),
    new Temp(6L, "Feb 1", 4.8),
    new Temp(7L, "Feb 2", 5.1),
    new Temp(9L, "Feb 5", -1.9),
    new Temp(10L, "Feb 8", 0),
    new Temp(11L, "Feb 12", 2.6)
]


def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

def ds = new JRBeanCollectionDataSource(data)

def params = [:]
def jPrint = JasperFillManager.fillReport(jrReport, params, ds)

JasperExportManager.exportReportToPdfFile(jPrint, "report.pdf")

This is the Groovy code to generate the report.

def data = [
    new Temp(1L, "Jan 1", -7.3),
    new Temp(2L, "Jan 10", -3.4),
    new Temp(3L, "Jan 12", -5.0),
    new Temp(4L, "Jan 20", -0.9),
    new Temp(5L, "Jan 30", -2.2),
    new Temp(6L, "Feb 1", 4.8),
    new Temp(7L, "Feb 2", 5.1),
    new Temp(9L, "Feb 5", -1.9),
    new Temp(10L, "Feb 8", 0),
    new Temp(11L, "Feb 12", 2.6)
]

We have a list of temperature values.

def ds = new JRBeanCollectionDataSource(data)

def params = [:]
def jPrint = JasperFillManager.fillReport(jrReport, params, ds)

The data is sent to the report engine in the JRBeanCollectionDataSource.

Using JRChartCustomizer

In the report template, we have only a limited set of tags and attributes to modify the scatter chart. For more customizations, we can use the JRChartCustomizer.

report.xml
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
            http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
        name="report" pageWidth="595" pageHeight="842" columnWidth="555"
        leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">

    <field name="id" class="java.lang.Long"/>
    <field name="date"/>
    <field name="val" class="java.lang.Double"/>

    <summary>
        <band height="450" splitType="Stretch">
            <scatterChart>
                <chart isShowLegend="true" customizerClass="com.zetcode.ScatterChartCustomizer" >
                    <reportElement x="0" y="0" width="450" height="400"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <xyDataset>
                    <dataset/>
                    <xySeries>
                        <seriesExpression><![CDATA[ "Temperatures" ]]></seriesExpression>
                        <xValueExpression><![CDATA[ $F{id} ]]></xValueExpression>
                        <yValueExpression><![CDATA[ $F{val} ]]></yValueExpression>
                    </xySeries>
                </xyDataset>
                <scatterPlot isShowLines="false" isShowShapes="true">
                    <plot/>
                    <xAxisFormat>
                        <axisFormat/>
                    </xAxisFormat>
                    <yAxisFormat>
                        <axisFormat/>
                    </yAxisFormat>
                </scatterPlot>
            </scatterChart>
        </band>
    </summary>
</jasperReport>

The chart customizer is specified in the chart tag.

lt;chart isShowLegend="true" customizerClass="com.zetcode.ScatterChartCustomizer" >

We apply the chart customizer in the customizerClass attribute of the chart tag.

report.gvy
package com.zetcode

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.17.0')

import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
import groovy.transform.Immutable

import net.sf.jasperreports.engine.JRChart
import net.sf.jasperreports.engine.JRChartCustomizer
import org.jfree.chart.JFreeChart

import java.awt.geom.Ellipse2D
import java.awt.Color

// Report generation

def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

@Immutable
class Temp {
    long id;
    String date;
    double val;
}

def data = [
    new Temp(1L, "Jan 1", -7.3),
    new Temp(2L, "Jan 10", -3.4),
    new Temp(3L, "Jan 12", -5.0),
    new Temp(4L, "Jan 20", -0.9),
    new Temp(5L, "Jan 30", -2.2),
    new Temp(6L, "Feb 1", 4.8),
    new Temp(7L, "Feb 2", 5.1),
    new Temp(9L, "Feb 5", -1.9),
    new Temp(10L, "Feb 8", 0),
    new Temp(11L, "Feb 12", 2.6)
]

def ds = new JRBeanCollectionDataSource(data)

def params = [:]
params.put("data", data)

def jPrint = JasperFillManager.fillReport(jrReport, params, ds)

JasperExportManager.exportReportToPdfFile(jPrint, "report.pdf")

// Chart customizer

class ScatterChartCustomizer implements JRChartCustomizer {

    void customize(JFreeChart chart, JRChart jasperChart) {

        def xyPlot = chart.getXYPlot()
        def xyItemRenderer = xyPlot.getRenderer()

        def shape = new Ellipse2D.Double(0, 0, 8, 8)

        xyItemRenderer.setSeriesShape(0, shape)
        xyItemRenderer.setSeriesPaint(0, new Color(0, 124, 156))

        xyPlot.setDomainGridlinesVisible(false)
        xyPlot.setRangeGridlinesVisible(false)
    }
}

The second script uses the JRChartCustomizer to customize the scatter chart.

void customize(JFreeChart chart, JRChart jasperChart) {

The customization is done in the customize method. The chart gives access to the methods of the underlying JFreeChart library while the jasperChart to the methods of the JasperReports' abstractions.

def xyPlot = chart.getXYPlot()
def xyItemRenderer = xyPlot.getRenderer()

We get hold of the chart renderer.

def shape = new Ellipse2D.Double(0, 0, 8, 8)

xyItemRenderer.setSeriesShape(0, shape)
xyItemRenderer.setSeriesPaint(0, new Color(0, 124, 156))

We change the shape and the colour of the scatter items.

xyPlot.setDomainGridlinesVisible(false)
xyPlot.setRangeGridlinesVisible(false)

We turn off the grid lines.

In this tutorial, we have used a scatter chart in our report created with JasperReports library. List all JasperReports tutorials.