【问题标题】:How to add XY-line to bar chart creating a multitype chart with another axis?如何将 XY 线添加到条形图以创建具有另一个轴的多类型图表?
【发布时间】:2016-03-08 13:05:31
【问题描述】:

只是想知道是否有可能创建这样一个将多种图表类型组合在一起的 Jasper 报告图表?

就我而言,我想在两个不同的轴上组合 条形图XY 线。我已经准备好以下类型的条形图:

理想情况下,我也可以在同一张图表中添加一条 XY 线,这将显示每个月所有小时类型总和的累积值。见最后的图片。我觉得这是不可能的,也许我应该为 XY 线创建一个单独的图表?

【问题讨论】:

  • 不清楚,您在这里问什么?...如果您喜欢使用定制器,可以在条形图中画一条线...您在最后一个问题的答案中看到我的链接吗?
  • 我注意到了这个链接,但我想我过去有时已经浏览过它。如果我没记错的话,那个链接展示了一个简单的直线被添加到报告中的情况。就我而言,我想在报告的右侧添加一个 XY 线 + 额外的专用 y 值方案。理想情况下,此 XY 线的数据将从此处描述的相同 ChartData 填充:stackoverflow.com/questions/35800235/…。我在原始问题中添加了描述情况的图像。定制器可以这样做吗?
  • 不,您需要 multiAxisChart 并分别定义每个系列,我已经发布了答案。下次先发布您的最终解决方案,以便我们立即为您的实施找到正确的数据源。然而,展示这两种方法很有趣,现在您了解了有关 jasper-reports 中图表的一切
  • 我同意。我只是倾向于一点一点地处理事情,比如首先创建更简单的用例,然后尝试在此基础上构建。这一次不是理想的方法。老实说,我只盯着那条 XY 线,直到很久以后才注意到那些“第二轴”值,所以我想这将是这次唯一的路径......
  • np 是时候在 SO 上放一些漂亮的图表示例了

标签: jasper-reports bar-chart


【解决方案1】:

这是对这个问题How to populate chart data with JavaBeans collection dataSet? 的跟进(如果您喜欢简单的条形图并动态使用系列表达式,请参阅我的answer 以了解更多详细信息)

要实现多轴图表,您应该使用<multiAxisChart>,它会变得有点复杂。我们不能再使用动态的seriesExpression,需要手动定义每个系列,所以我会使用你原来的bean,但仍然在一个单独的数据源中。

Java 豆

public class WorkingHours {

    private int month = 0;
    private double hoursNormal = 0;
    private double hoursTravel = 0;
    private double hoursOvertime = 0;
    private double hoursTotalCumulative = 0;

    public WorkingHours(int month, double hoursNormal, double hoursTravel, double hoursOvertime, double hoursTotalCumulative) {
        super();
        this.month = month;
        this.hoursNormal = hoursNormal;
        this.hoursTravel = hoursTravel;
        this.hoursOvertime = hoursOvertime;
        this.hoursTotalCumulative = hoursTotalCumulative;
    }
    //getter and setter
}

填写数据(使用您的逻辑)并在参数中作为java.util.List 传递

List<WorkingHours> list = new ArrayList<WorkingHours>();
list.add(new WorkingHours(1, 2.3, 1.2, 2.1,4.1));
list.add(new WorkingHours(2, 5.3, 2.2,3, 9.1));
list.add(new WorkingHours(3, 3.1, 0.5, 2.0, 20.5));
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("CHART_DATA", list);

报告 (jrxml)

<?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="working_hours" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="1a12c021-57e2-4482-a273-56cbd3f78a17">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <subDataset name="chartDataSet" uuid="119b7f0e-01ef-4e2b-b628-d76f51e83768">
        <field name="month" class="java.lang.Integer"/>
        <field name="hoursNormal" class="java.lang.Double"/>
        <field name="hoursTravel" class="java.lang.Double"/>
        <field name="hoursOvertime" class="java.lang.Double"/>
        <field name="hoursTotalCumulative" class="java.lang.Double"/>
    </subDataset>
    <parameter name="CHART_DATA" class="java.util.List" isForPrompting="false"/>
    <summary>
        <band height="282" splitType="Stretch">
            <multiAxisChart>
                <chart evaluationTime="Report">
                    <reportElement x="62" y="17" width="419" height="235" uuid="8a16251e-8c1a-4384-8487-9be8f6c274e5"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend position="Right"/>
                </chart>
                <multiAxisPlot>
                    <plot/>
                    <axis position="rightOrBottom">
                        <lineChart>
                            <chart evaluationTime="Report">
                                <reportElement positionType="Float" x="0" y="25" width="270" height="175" backcolor="#FFFFFF" uuid="4a755d76-1350-4921-a0be-20ae9e485e12"/>
                                <chartTitle color="#000000"/>
                                <chartSubtitle color="#000000"/>
                                <chartLegend textColor="#000000" backgroundColor="#FFFFFF" position="Right"/>
                            </chart>
                            <categoryDataset>
                                <dataset>
                                    <datasetRun subDataset="chartDataSet" uuid="abec2dce-b670-4e84-b71f-469d954dbcb5">
                                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{CHART_DATA})]]></dataSourceExpression>
                                    </datasetRun>
                                </dataset>
                                <categorySeries>
                                    <seriesExpression><![CDATA["Total Cum"]]></seriesExpression>
                                    <categoryExpression><![CDATA[$F{month}]]></categoryExpression>
                                    <valueExpression><![CDATA[$F{hoursTotalCumulative}]]></valueExpression>
                                </categorySeries>
                            </categoryDataset>
                            <linePlot isShowLines="true" isShowShapes="true">
                                <plot>
                                    <seriesColor seriesOrder="0" color="#9900CC"/>
                                </plot>
                                <categoryAxisFormat>
                                    <axisFormat/>
                                </categoryAxisFormat>
                                <valueAxisLabelExpression><![CDATA["Total Cum"]]></valueAxisLabelExpression>
                                <valueAxisFormat>
                                    <axisFormat labelColor="#000000" tickLabelColor="#000000" tickLabelMask="#,##0" axisLineColor="#000000"/>
                                </valueAxisFormat>
                            </linePlot>
                        </lineChart>
                    </axis>
                    <axis>
                        <barChart>
                            <chart evaluationTime="Report">
                                <reportElement x="0" y="0" width="0" height="0" backcolor="#FFFFFF" uuid="723abd06-b593-422a-b679-043084525a8c"/>
                                <chartTitle color="#000000"/>
                                <chartSubtitle color="#000000"/>
                                <chartLegend textColor="#000000" backgroundColor="#FFFFFF" position="Right"/>
                            </chart>
                            <categoryDataset>
                                <dataset>
                                    <datasetRun subDataset="chartDataSet" uuid="abec2dce-b670-4e84-b71f-469d954dbcb5">
                                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{CHART_DATA})]]></dataSourceExpression>
                                    </datasetRun>
                                </dataset>
                                <categorySeries>
                                    <seriesExpression><![CDATA["Normal"]]></seriesExpression>
                                    <categoryExpression><![CDATA[$F{month}]]></categoryExpression>
                                    <valueExpression><![CDATA[$F{hoursNormal}]]></valueExpression>
                                </categorySeries>
                                <categorySeries>
                                    <seriesExpression><![CDATA["Travel"]]></seriesExpression>
                                    <categoryExpression><![CDATA[$F{month}]]></categoryExpression>
                                    <valueExpression><![CDATA[$F{hoursTravel}]]></valueExpression>
                                </categorySeries>
                                <categorySeries>
                                    <seriesExpression><![CDATA["Overtime"]]></seriesExpression>
                                    <categoryExpression><![CDATA[$F{month}]]></categoryExpression>
                                    <valueExpression><![CDATA[$F{hoursOvertime}]]></valueExpression>
                                </categorySeries>
                            </categoryDataset>
                            <barPlot>
                                <plot/>
                                <itemLabel/>
                                <categoryAxisFormat>
                                    <axisFormat/>
                                </categoryAxisFormat>
                                <valueAxisLabelExpression><![CDATA["h"]]></valueAxisLabelExpression>
                                <valueAxisFormat>
                                    <axisFormat labelColor="#000000" tickLabelColor="#000000" tickLabelMask="#,##0" axisLineColor="#000000"/>
                                </valueAxisFormat>
                            </barPlot>
                        </barChart>
                    </axis>
                </multiAxisPlot>
            </multiAxisChart>
        </band>
    </summary>
</jasperReport>

要点:

我们使用&lt;multiAxisChart&gt; 和2 个&lt;axis&gt; 一个&lt;lineChart&gt; 另一个&lt;barChart&gt;,对于&lt;barChart&gt;,我们分别定义每个&lt;categorySeries&gt;

输出

有关图表上的更多演示,请参阅:Jasper Reports Chart Samples

【讨论】:

  • 感谢非常好的回答!我注意到 Jasper 图表中的一个非常烦人的功能。似乎至少在这个多轴图表中,不可能使用 $R{message.keys} 来本地化系列文本。例如,如果我将 替换为 ,Jasper 将抛出一个“引起:net.sf.jasperreports.engine.JRRuntimeException:类别系列名称为空。”错误。似乎在创建图表之前无法读取文本,因此该值仍然为空。
  • @Vka,我无法重现这个,它对我来说很好用我在 jasperReport 中定义的包中使用 $R{test} 做了一个简单的测试我有 test=Hello,它工作得很好.
  • 好吧,我想我不得不在将数据传递到图表之前对消息进行本地化,以便消息在数据集中的格式已经正确。
  • 好的,那我的环境可能有问题。
  • 我在这里看到了一些奇怪的东西 R{lw 是正确的吗?,试着把它放到一个 textField 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2021-03-25
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
相关资源
最近更新 更多