You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:03:07