Python如何用matplotlib绘制均匀分布的2×2三维散点子图
2×2均匀分布3D散点子图实现方案
问题根因
你当前代码中子图重叠拥挤的核心是add_subplot的网格参数混用了两套划分规则:211代表将画布划分为2行1列取第1个位置,221代表将画布划分为2行2列取第1个位置,两种划分规则叠加就会导致子图位置重叠错乱。
正确实现代码
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np # 1. 创建画布,可提前设置画布尺寸避免默认尺寸太小导致拥挤 fig = plt.figure(figsize=(12, 10)) # 2. 统一使用2行2列的网格规则创建4个3D子图 # 2行2列第1个位置(左上) ax_tl = fig.add_subplot(2, 2, 1, projection='3d') # 2行2列第2个位置(右上) ax_br = fig.add_subplot(2, 2, 2, projection='3d') # 2行2列第3个位置(左下) ax_Y0 = fig.add_subplot(2, 2, 3, projection='3d') # 2行2列第4个位置(右下) ax_Y1 = fig.add_subplot(2, 2, 4, projection='3d') # 示例:给每个子图绘制3D散点 x, y, z = np.random.randn(3, 100) for ax in [ax_tl, ax_br, ax_Y0, ax_Y1]: ax.scatter(x, y, z) # 可自行设置坐标轴标签 ax.set_xlabel('X轴') ax.set_ylabel('Y轴') ax.set_zlabel('Z轴') # 3. 自动调整子图间距,避免标签、标题重叠 plt.tight_layout() plt.show()
关键优化点
- 统一使用
(行数, 列数, 序号)的传参方式,避免使用三位数缩写的歧义,所有子图都基于2行2列的同一套网格划分 - 提前通过
figsize设置合适的画布尺寸,避免默认画布太小导致元素拥挤 - 调用
plt.tight_layout()自动计算子图间距,适配坐标轴标签、标题的显示空间
如果需要手动调整更精细的间距,也可以用plt.subplots_adjust()来自定义上下左右边距和子图间的横纵间距,示例:
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.3, hspace=0.3)
其中wspace是子图横向间距,hspace是子图纵向间距。
内容的提问来源于stack exchange,提问作者pysolver33
相关产品推荐
相关产品推荐

