2017-04-11 103 views
0

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

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 ?? 

回答

1

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

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

首先,创建数据表的子报表并设置。其次,为折线图准备另一个数据源并进行设置。

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)); 
    } 
} 

然后用这个定制符合甜菜建设者。

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

+0

嗨,旋转的东西工作。但我需要在一天内(也许每隔5秒)绘制收集的数据。有了50个数据点,X轴看起来像这样:https://drive.google.com/open?id=0B-m6SCJULOTRUzVERVJwYllTY0E有了1000个数据点,它变得一团糟。我只需要显示小时值,例如12:00,01:00,02:00等,而不是所有的时间戳。 – SuDu

+0

如果您不希望数据中有1000个点,那么只需在数据源中输入所需的点。你需要操纵你的数据源。 – Laurence

+0

嗯..我需要1000s的数据点。我不需要显示所有的X轴值。只需要显示其中的一些。在gdrive的例子中,如果我们可以将X轴项目限制为10,但仍然具有全部50个数据点,那将是非常好的。 – SuDu

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(); 
    }  
}