Matplotlib子图与尺寸设置问题:如何实现两张10x10图表的并排或上下排列?
问题分析与修正方案
你的代码主要有两个关键问题导致布局失效,下面我会逐一说明并给出修复后的完整代码:
核心错误点
- 重复创建轴对象破坏布局:你先通过
fig.add_subplot(1,2,1)创建了第一个子图的轴,但紧接着又调用plt.axes(projection='3d')重新生成了一个新的轴,这会直接覆盖之前的subplot,导致原本的1行2列布局被打乱。 - 子图尺寸的实现逻辑:
figsize是整个画布的尺寸,你想要两个10x10的子图,并排的话画布宽度应为20(10×2)、高度10;如果是上下排列,画布高度应为20、宽度10,这样每个子图就能刚好占据10x10的空间。
修复后的完整代码
import matplotlib.pyplot as plt import numpy as np def f(x, y): return np.sin(x)*np.sin(y) x = np.linspace(-np.pi, np.pi, 100) y = np.linspace(-np.pi, np.pi, 100) X, Y = np.meshgrid(x, y) Z = f(X, Y) # 并排布局:画布20x10,两个子图各占10x10 fig = plt.figure(figsize=(20, 10)) # 直接在add_subplot时指定3D投影,无需额外调用plt.axes ax1 = fig.add_subplot(1, 2, 1, projection='3d') ax1.view_init(20, 25) ax1.plot_surface(X, Y, Z, cmap='RdGy', edgecolor='none') ax1.set_xlabel('x') ax1.set_ylabel('y') ax1.set_zlabel('z') # 创建第二个填充等高线图的子图 ax2 = fig.add_subplot(1, 2, 2) ax2.contourf(X, Y, Z, 40, cmap='RdGy') ax2.axis('equal') plt.tight_layout() # 自动调整子图间距,避免标签重叠 plt.show()
额外说明
如果想要上下排列两个10x10的子图,只需要修改两处:
- 把画布尺寸改成
figsize=(10, 20) - 把两个subplot的参数分别改成
(2, 1, 1)和(2, 1, 2)
这样就能完美实现你想要的布局效果啦!
内容的提问来源于stack exchange,提问作者Red-Cloud
相关产品推荐
相关产品推荐

