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

如何解决subplot排列多个3D图时重叠无法形成网格布局问题

3D多图网格布局重叠问题修复方案

问题参考

你遇到的subplot参数调整无效、所有3D图重叠显示的效果及对应代码参考:
单幅3D图代码、subplot调用代码及对应输出效果

故障核心原因

布局参数完全不生效的本质是子图轴与绘图操作未绑定:调用subplot/subplots创建网格后,你没有使用接口返回的对应位置的轴对象绘制3D内容,仍然使用plt开头的全局绘图接口。这种写法下每次执行绘图操作,matplotlib都会自动生成一个占满整个画布的新轴,覆盖之前创建的网格子图,无论怎么修改nrows/ncols取值都不会改变最终布局。

原生subplot修复写法

按2行3列排布6幅3D图的可复现代码如下,所有3D绘图操作必须绑定到对应位置的轴对象上:

import matplotlib.pyplot as plt
import numpy as np
# matplotlib 3.4以下版本需额外导入下一行依赖
# from mpl_toolkits.mplot3d import Axes3D

# 创建符合科研论文分辨率要求的画布
fig = plt.figure(figsize=(12, 8), dpi=300)

# 逐个创建2行3列网格对应位置的3D轴,位置索引从1开始计数
ax1 = fig.add_subplot(2, 3, 1, projection='3d')
# 第一幅3D图所有操作调用ax1的方法完成,不要用plt.xxx()
# 示例:ax1.plot_surface(X1, Y1, Z1, cmap='viridis')
# ax1.set_xlabel('X label')

ax2 = fig.add_subplot(2, 3, 2, projection='3d')
# 第二幅3D图绑定ax2绘制

ax3 = fig.add_subplot(2, 3, 3, projection='3d')
# 第三幅3D图绑定ax3绘制

ax4 = fig.add_subplot(2, 3, 4, projection='3d')
# 第四幅3D图绑定ax4绘制

ax5 = fig.add_subplot(2, 3, 5, projection='3d')
# 第五幅3D图绑定ax5绘制

ax6 = fig.add_subplot(2, 3, 6, projection='3d')
# 第六幅3D图绑定ax6绘制

# 自动调整子图间距,避免轴标签、刻度遮挡
plt.tight_layout()
# 保存图片时加bbox_inches='tight'避免边缘内容被裁切,符合期刊投稿要求
plt.savefig('3d_grid_figure.png', bbox_inches='tight')
plt.show()

其他可用的网格布局实现函数

除了逐个子图添加的add_subplot,还有两个更适合科研插图排版的接口可选:

  • plt.subplots():一次性生成整个网格的所有轴对象,代码更简洁,适合规则网格布局
# 一次性创建2行3列的3D子图网格
fig, axs = plt.subplots(
    nrows=2, ncols=3,
    figsize=(12, 8), dpi=300,
    subplot_kw={'projection': '3d'}
)
# axs是形状为(2,3)的二维数组,按行列索引调用即可
axs[0, 0].plot_surface(...) # 第一行第一列
axs[0, 1].plot_surface(...) # 第一行第二列
axs[1, 2].plot_surface(...) # 第二行第三列
plt.tight_layout()
  • matplotlib.gridspec.GridSpec:支持自定义子图宽高比、跨行跨列、手动设置间距,适合需要加子图标注(a)(b)(c)、个别子图尺寸更大的复杂排版场景
import matplotlib.gridspec as gridspec

fig = plt.figure(figsize=(12, 8), dpi=300)
# 定义2行3列网格,自定义宽高比、子图间距
gs = gridspec.GridSpec(
    nrows=2, ncols=3, figure=fig,
    width_ratios=[1, 1, 1],
    height_ratios=[1, 1],
    wspace=0.3, hspace=0.25
)
ax1 = fig.add_subplot(gs[0, 0], projection='3d')
ax2 = fig.add_subplot(gs[0, 1], projection='3d')
# 其余子图按gs的行列索引创建即可

避坑提示

  • 所有子图必须创建在同一个figure对象下,不要在绘图过程中重复调用plt.figure()
  • 旧版本matplotlib必须导入Axes3D才能识别3D投影参数,否则会创建普通2D轴导致绘图异常
  • 如果tight_layout()调整后仍有内容遮挡,可以调用fig.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)手动微调边距

内容的提问来源于stack exchange,提问作者Elizabeth Ng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:15:34