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

XSSF散点图调用plot后标记带连线,疑因addStyle默认设置问题求助

我懂你遇到的困扰了——用Apache POI创建散点图时,明明选了LineMarker样式,结果所有标记却被线条连在了一起,这完全不是你想要的纯散点效果对吧?

你猜的没错,问题确实出在XSSFScatterChartData.addStyle的默认行为上:它默认会把散点样式设置为STScatterStyle.LINE_MARKER,这个样式的定义就是带标记的连续线条,所以POI会自动用线条连接所有数据点。要得到纯散点(只有标记、没有连接线)的效果,你需要手动覆盖这个默认样式,把它改成STScatterStyle.MARKER。

下面是针对你的setTrainingTimeGraph方法修改后的完整代码示例,重点看散点样式设置的部分:

private void setTrainingTimeGraph(Sheet trainingTimeSheet, Sheet resultsSheet) {
    Drawing drawing = trainingTimeSheet.createDrawingPatriarch();
    // 调整锚点位置到你需要的区域
    ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 20);

    XSSFChart chart = (XSSFChart) drawing.createChart(anchor);
    chart.setTitleText("Training Time vs Performance");
    chart.setTitleOverlay(false);

    // 创建坐标轴
    ValueAxis xAxis = chart.createValueAxis(AxisPosition.BOTTOM);
    xAxis.setTitleText("Training Time (Hours)");
    ValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);
    yAxis.setTitleText("Performance Score");

    // 构建散点图数据
    XSSFScatterChartData data = (XSSFScatterChartData) chart.getChartDataFactory().createScatterChartData();

    // 从resultsSheet读取X、Y轴数据(这里假设数据在第2行到第11行,第1列是X,第2列是Y)
    ChartDataSource<Number> xData = DataSources.fromNumericCellRange(resultsSheet, new CellRangeAddress(1, 10, 0, 0));
    ChartDataSource<Number> yData = DataSources.fromNumericCellRange(resultsSheet, new CellRangeAddress(1, 10, 1, 1));

    // 添加数据系列
    XSSFChartData.Series series = (XSSFChartData.Series) data.addSeries(xData, yData);
    series.setTitle("Training Results", null);

    // 关键步骤:修改散点样式为仅显示标记,取消连接线
    XSSFScatterChartData.ScatterStyle style = data.addStyle(series);
    style.setScatterStyle(STScatterStyle.MARKER);

    // 可选:自定义标记的形状、大小和颜色
    series.getCTScatterSer().getMarker().setSymbol(STMarkerStyle.CIRCLE); // 设置标记为圆形
    series.getCTScatterSer().getMarker().setSize((short) 8); // 设置标记大小
    // 设置标记填充色为红色
    CTSolidFillProperties fill = series.getCTScatterSer().getMarker().addNewSolidFill();
    fill.addNewSrgbClr().setVal(new byte[]{(byte) 255, 0, 0});

    // 绘制图表
    chart.plot(data, xAxis, yAxis);
}

简单解释下核心修改:

  • STScatterStyle.MARKER是纯散点样式,只会渲染每个数据点的标记,不会生成连接线条
  • 如果需要更个性化的散点效果,还可以通过getMarker()方法调整标记的形状、尺寸和颜色

这样修改后,你的散点图就会只显示独立的标记点,不会有多余的连接线啦。

内容的提问来源于stack exchange,提问作者Pedropablo López Amaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:23:29