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 库在报表中使用了散点图。