Dynamic Reports折线图Y轴无法对齐问题求助
解决Dynamic Reports双折线图Y轴对齐问题
两个折线图Y轴未对齐的核心原因是各自根据自身数据自动计算Y轴范围,要实现对齐,需手动为两个图表设置统一的Y轴最小值和最大值。
实现步骤
- 遍历数据源,获取两个系列数据的全局最小、最大值,确保Y轴范围能覆盖所有数据
- 为每个折线图配置固定的Y轴范围
修改后的完整代码
// 1. 提前获取数据源并计算Y轴全局极值 JRDataSource dataSource = createDataSource(); Integer minY = Integer.MAX_VALUE; Integer maxY = Integer.MIN_VALUE; try { while (dataSource.next()) { // 替换为实际字段名,需和detectsColumn、rangeColumn对应 Integer detects = (Integer) dataSource.getFieldValue("detectsColumn"); Integer range = (Integer) dataSource.getFieldValue("rangeColumn"); if (detects != null) { minY = Math.min(minY, detects); maxY = Math.max(maxY, detects); } if (range != null) { minY = Math.min(minY, range); maxY = Math.max(maxY, range); } } // 重置数据源指针,供报表使用 dataSource.moveFirst(); } catch (JRException e) { e.printStackTrace(); } // 2. 创建折线图并设置统一Y轴范围 LineChartBuilder lineChart1 = cht.lineChart() .setCategory(itemColumn) .setShowValues(false) .setTitle("Line chart") .setCategoryAxisFormat(cht.axisFormat().setLabel("Item")) .setShowShapes(false) .setRangeAxisFormat(cht.axisFormat() .setMinValue(minY) .setMaxValue(maxY)) // 绑定全局最小值 .series(cht.serie(detectsColumn)); LineChartBuilder lineChart2 = cht.lineChart() .setCategory(itemColumn) .setShowValues(false) .setTitle("Line chart") .setCategoryAxisFormat(cht.axisFormat().setLabel("Item")) .setShowShapes(false) .setRangeAxisFormat(cht.axisFormat() .setMinValue(minY) .setMaxValue(maxY)) // 绑定全局最大值 .series(cht.serie(rangeColumn)); // 生成报表 try { report().setTemplate(Templates.reportTemplate) .title(Templates.createTitleComponent("My Report")) .summary(lineChart1, lineChart2) .pageFooter(Templates.footerComponent) .setDataSource(dataSource) .show(); } catch (DRException e) { e.printStackTrace(); }
补充说明
- 如果数据是数值类型(如Double),需将
Integer替换为对应类型 - 若需要给Y轴范围留余量(比如比最大值大10%),可对
maxY做额外计算:maxY = (int) (maxY * 1.1),最小值同理调整
内容的提问来源于stack exchange,提问作者Yamasaki Noburo
相关产品推荐
相关产品推荐

