ZetCode

JasperReports 散点图

最后修改日期:2024 年 2 月 12 日

JasperReports 散点图教程展示了如何在 JasperReports 库中创建散点图。

JasperReports 是一个开源的报表库。它可以创建多种格式的报表,包括 PDF、HTML、XLS 或 CSV。

散点图使用笛卡尔坐标系,以变量在每个轴上的值为依据,来显示数值数据集。

JasperReports 散点图示例

在下面的示例中,我们将一个散点图放入报表中;该图表显示了温度值。

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>

散点图使用 scatterChart 标签。

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

模板中有三个字段。字段被映射到数据源的元素。在图表中,我们使用了 idval 字段。

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

在 x 轴上,我们放置了 id,在 y 轴上,我们放置了温度值。

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

scatterPlot 中,我们可以对图表进行一些自定义。

report.gvy
package com.zetcode

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')

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")

这是生成报表的 Groovy 代码。

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 = [:]
def jPrint = JasperFillManager.fillReport(jrReport, params, ds)

数据通过 JRBeanCollectionDataSource 发送到报表引擎。

使用 JRChartCustomizer

在报表模板中,我们只有有限的标签和属性来修改散点图。如需更多自定义,我们可以使用 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>

图表自定义器在 chart 标签中指定。

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

我们在 chart 标签的 customizerClass 属性中应用图表自定义器。

report.gvy
package com.zetcode

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')

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)
    }
}

第二个脚本使用 JRChartCustomizer 来自定义散点图。

void customize(JFreeChart chart, JRChart jasperChart) {

自定义在 customize 方法中完成。chart 允许访问底层 JFreeChart 库的方法,而 jasperChart 则允许访问 JasperReports 的抽象方法。

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)

我们关闭了网格线。

在本文中,我们使用 JasperReports 库在报表中使用了散点图。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 JasperReports 教程