如何在两个轴上创建包含日期的折线图?

时间:2017-05-23 09:25:56

标签: java jasper-reports jfreechart timeserieschart

我需要使用jasper-reports实现两个日期类型的轴。

时间序列图表允许x轴上的日期和y轴上的数字值,有没有办法实现两个日期类型轴,其中y轴和x轴都是日期类型?

1 个答案:

答案 0 :(得分:1)

要将y轴设置为您需要的日期轴。

<强> 1。将valueExpression中的日期转换为java.lang.Number ,因为valueExpression只允许此类(或子类)

通过调用Date.getTime()

,而不是在java.util.Date中传递valueExpression,而是以毫秒java.lang.Long传递时间。
<valueExpression><![CDATA[$F{myDateOnYAxis}.getTime()]]></valueExpression>

<强> 2。添加JRChartCustomizer,将数字轴更改为具有相对格式化程序的日期轴

public class MyChartCustomizer implements JRChartCustomizer {

    @Override
    public void customize(JFreeChart jfchart, JRChart jrchart) {
        XYPlot plot = (XYPlot) jfchart.getPlot(); //get the plot

        //Create the new date axis for y
        DateAxis yDateAxis = new DateAxis();
        //Set desired time format
        DateFormat dateFormat = new SimpleDateFormat("MMM - yyyy"); 
        yDateAxis.setDateFormatOverride(dateFormat); 
        //Add your own Tickunit if you like (you can do with out also, comment out the below line and let JFreeChart decided)
        yDateAxis.setTickUnit(new DateTickUnit(DateTickUnitType.MONTH,3));

        //Set the new y-axis to the plot
        plot.setRangeAxis(yDateAxis);
    }
}

有关如何将JRChartCustomizer添加到您的设计(jrxml),请参阅Sample reference

结果

Resultl

*一些以意大利语格式化的随机日期

示例jrxml用于生成带有csv数据源的图

<?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="Test2DateGraph" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="2347c131-1884-430a-b77f-59f08f896c8a">
	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="Dates"/>
	<queryString language="csv">
		<![CDATA[]]>
	</queryString>
	<field name="Date1" class="java.util.Date"/>
	<field name="Date2" class="java.util.Date"/>
	<summary>
		<band height="353">
			<timeSeriesChart>
				<chart evaluationTime="Report" customizerClass="MyChartCustomizer">
					<reportElement x="10" y="50" width="530" height="256" uuid="4a93e72e-251b-4026-bb11-edc26ecd6599"/>
					<chartTitle/>
					<chartSubtitle/>
					<chartLegend/>
				</chart>
				<timeSeriesDataset>
					<timeSeries>
						<seriesExpression><![CDATA["SERIES 1"]]></seriesExpression>
						<timePeriodExpression><![CDATA[$F{Date2}]]></timePeriodExpression>
						<valueExpression><![CDATA[$F{Date2}.getTime()]]></valueExpression>
					</timeSeries>
				</timeSeriesDataset>
				<timeSeriesPlot>
					<plot/>
					<timeAxisFormat>
						<axisFormat/>
					</timeAxisFormat>
					<valueAxisFormat>
						<axisFormat/>
					</valueAxisFormat>
				</timeSeriesPlot>
			</timeSeriesChart>
		</band>
	</summary>
</jasperReport>

  

注意:如果您不使用timeSeriesChart,则需要使用x轴完成相同操作。