2017-04-11 8 views
0

1000以上のデータポイントを使用してLineChartReportを作成しようとしています。問題は、X軸にタイムスタンプが表示され、データポイントが多すぎるためにデータが重複し、わかりやすいデータが表示されないということです。だから、私は2つのポイントを助ける必要があります: 1. X軸(のみ)のデータポイントを25に制限します。グラフ/チャートのデータポイントの数は1000のままです。 2.タイムスタンプデータを90回転させますタイムスタンプデータが正しく記録され、切り捨てられないようにします。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ポイントのデータが必要で、線グラフで少数のデータだけを必要とします。この場合、データテーブルと折れ線グラフに異なるデータソースを使用する必要があります。

まず、データテーブルのサブレポートを作成して設定します。

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

第2に、折れ線グラフの別のデータソースを準備してセットアップします。あなたの2番目の質問について

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

こんにちは、回転のものが働いた。しかし、私は1日(おそらく5秒ごと)に収集されたデータをプロットする必要があります。 50データポイントでは、X軸は次のようになります。https://drive.google.com/open?id=0B-m6SCJULOTRUzVERVJwYllTY0E 1000ポイントのデータポイントでは、それは混乱になります。すべてのタイムスタンプではなく、時間値(例:12:00、01:00、02:00など)のみを表示する必要があります。 – SuDu

+0

データに1000ポイントを必要としない場合は、必要なポイントをデータソースに配置します。あなたはあなたのデータソースを操作する必要があります。 – Laurence

+0

うーん。私は1000点のデータポイントが必要です。 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(); 
    }  
} 
関連する問題