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"/>
模板中有三个字段。字段被映射到数据源的元素。在图表中,我们使用了 id 和 val 字段。
<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 库在报表中使用了散点图。