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
相关产品推荐
相关产品推荐

