Apache POI生成散点图异常求助:线条弯曲、图例显示异常
解决Apache POI生成散点图的两个异常问题
你遇到的两个问题:线条莫名呈曲线、每个数据点单独显示图例且颜色各异,都是Apache POI生成散点图时常见的配置疏漏,咱一步步来解决:
问题1:散点图线条变成曲线
这是因为你没有显式禁用散点图的平滑曲线属性。Apache POI中,散点图的线条默认会启用平滑效果,需要手动关闭才能显示直线。
问题2:每个数据点单独出现在图例
这是因为你把每个数据点都创建成了独立的数据系列(Series)。正确的做法是将所有数据点归到同一个系列下,这样图例只会显示一个条目,所有点共用同一种样式和颜色。
修正后的代码示例
下面是调整后的完整代码片段,关键修改点已经标注:
public void GenerateChart(XSSFSheet sheet) { XSSFDrawing drawing = sheet.createDrawingPatriarch(); // 调整图表锚点位置,可根据需求修改参数 XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 5, 1, 15, 20); XSSFChart chart = drawing.createChart(anchor); chart.setTitleText("带直线和数据标记的散点图"); chart.setTitleOverlay(false); // 创建带直线和标记的散点图数据模型 XDDFScatterChartData data = (XDDFScatterChartData) chart.createData(ChartTypes.SCATTER, null, null); // 只创建一个数据系列,所有数据点都归到这个系列下 XDDFScatterChartData.Series series = (XDDFScatterChartData.Series) data.addSeries(); series.setTitle("数据系列", null); // 系列名称将显示在图例中 // 假设x值在A列(第0列)、y值在B列(第1列),数据行从第2行(索引1)到第10行(索引9) XDDFDataSource<Double> xData = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 9, 0, 0)); XDDFNumericalDataSource<Double> yData = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 9, 1, 1)); series.setValues(yData); series.setCategoryData(xData); // 关键1:设置线条为直线,关闭平滑曲线 if (series.getShapeProperties() == null) { series.setShapeProperties(new XDDFShapeProperties()); } XDDFLineProperties lineProps = new XDDFLineProperties(); lineProps.setFillProperties(new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLUE))); lineProps.setSmooth(false); // 禁用平滑,强制显示直线 series.getShapeProperties().setLineProperties(lineProps); // 设置数据标记样式(可选,根据需求调整) XDDFMarker marker = new XDDFMarker(); marker.setSymbol(MarkerStyle.CIRCLE); marker.setSize((short) 8); marker.setFillProperties(new XDDFSolidFillProperties(XDDFColor.from(PresetColor.RED))); series.setMarker(marker); // 绘制图表 chart.plot(data); // 调整图例位置,避免遮挡图表内容 XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); }
关键修改说明
- 只创建一个数据系列:所有数据点都添加到同一个
series对象中,解决图例分散的问题。 - 显式设置
lineProps.setSmooth(false):关闭线条的平滑效果,让散点图显示直线连接。 - 统一设置数据标记样式:确保所有点使用相同的标记样式和颜色。
内容的提问来源于stack exchange,提问作者Zyzyx
相关产品推荐
相关产品推荐

