DynamicReport - 如何绘制太多数据点

时间:2017-04-11 07:59:35

标签: jfreechart linechart dynamic-reports

我正在尝试使用超过1000个数据点创建LineChartReport。问题是X轴应该显示时间戳,并且由于数据点太多,数据会重叠,并且不会显示可理解的数据。所以我需要帮助以下两点:     1.将X轴上的数据点(仅限)限制为25.图表/图表的数据点数仍保持为1000     2.将时间戳数据旋转90度,以便正确记录时间戳数据,而不是截断。

Have tried to get the domain axis and manipulate it, like this, but the library does not allow that:

CategoryAxis domainAxis = chart.getCategoryPlot().getDomainAxis();
domainAxis.setMinorTickMarksVisible(false);
domainAxis.clearCategoryLabelToolTips();
chart.getCategoryPlot().getDataset().getColumnKeys()
CategoryDataset ds = chart.getCategoryPlot().getDataset();
List ls = ds.getColumnKeys();
List ls2 = new ArrayList();

int i = 0;
for (Iterator it = ls.iterator(); it.hasNext(); ) {
    it.next(); 
    if (i % 2 != 0) {
        ls2.add(ls.get(i));
    }
    i++;
}
chart.getCategoryPlot().setDataset(ds);



Sample image with 10 data points appear here: https://drive.google.com/drive/u/0/folders/0B-m6SCJULOTRdHZ6cUwxX041SHM

Any suggestions ??

2 个答案:

答案 0 :(得分:1)

以下代码基于DynamicReport 4.0.2。我没有在其他版本中测试它们。

关于您的第一个问题,您需要1000个数据点,并且只想要折线图中的少量数据。在这种情况下,您需要为数据表和折线图使用不同的数据源。

首先,为数据表创建子报告并进行设置。

SubreportBuilder subreport = cmp.subreport(
    report().setTemplate(Templates.reportTemplate)
            .addColumn(
                col.column("Name", "name", type.stringType()), 
                col.column("Counts", "value", type.integerType())
            )
);
JasperReportBuilder reportContent = report();
subreport.setDataSource(allDatasource);
reportContent.summary(subreport, cmp.verticalGap(20));

其次,为折线图准备另一个数据源并进行设置。

reportContent.setTemplate(Templates.reportTemplate)
    /* add title */
    .title(title, subtitle,
    /* add chart in the head of title */
    cmp.verticalList(LINE_CHART)
    /* set style */ 
    .setStyle(stl.style().setBottomPadding(30).setTopPadding(30)))
    /* set data source for line chart*/
    .setDataSource(dataSource);

关于第二个问题,您首先需要创建自定义程序

public class DynamicLineCustomizer implements DRIChartCustomizer, Serializable {
private static final long serialVersionUID = -8493880774698206000L;

@Override
public void customize(JFreeChart jFreeChart, ReportParameters reportParameters) {
    CategoryPlot plot = jFreeChart.getCategoryPlot();
    CategoryAxis domainAxis = plot.getDomainAxis();
    domainAxis.setCategoryLabelPositions(CategoryLabelPositions
            .createUpRotationLabelPositions(Math.PI / 6.0));
    }
}

然后在行chard builder中使用此自定义程序

LineChartBuilder lineChart = cht.lineChart()
    .customizers(new DynamicLineCustomizer())
    .setCategory(columns[0])
    .series(createSeries(columns))
    .setCategoryAxisFormat(cht.axisFormat().setLabel("TimeStamp"))
    .seriesColors(seriesColors);

折线图和数据表如下所示:

line chart and data table

答案 1 :(得分:0)

这最终对我有用(希望它有所帮助):

参考:http://www.dynamicreports.org/forum/viewtopic.php?f=1&t=1046

private void build(String startDate, String endDate) {
    TextColumnBuilder<Integer> i = col.column("I", "I", type.integerType());
    TextColumnBuilder<Integer> b = col.column("B", "B", type.integerType());
    TextColumnBuilder<Integer> t = col.column("T", "T", type.integerType());
    TextColumnBuilder<Date> timeColumn = col.column("TimeStamp", "TimeStamp", type.dateType());

    createDataSource(startDate, endDate);

    try {   
        TimeSeriesChartBuilder timeSeriesChartBuilder1 = cht.timeSeriesChart();
        timeSeriesChartBuilder1.series(cht.serie(b), cht.serie(t), cht.serie(i));
        timeSeriesChartBuilder1.setShowShapes(false);
        timeSeriesChartBuilder1.setDataSource(dataSource);
        timeSeriesChartBuilder1.setTimePeriod(timeColumn);
        timeSeriesChartBuilder1.setTimePeriodType(TimePeriod.SECOND);
        timeSeriesChartBuilder1.setTitle("ABC Information");

        JasperReportBuilder builder = report()
                .summary(cht.multiAxisChart(timeSeriesChartBuilder1))
                .setTemplate(Templates.reportTemplate)
                .title(Templates.createTitleComponent("ABC Complete Info"))
                ;    
        builder.show();   
    } catch (Exception e) {
        e.printStackTrace();
    }       
}