如何使用Matplotlib在Python中创建垂直子图?我的代码为何异常?
问题:Matplotlib垂直子图绘制异常的原因及解决方法
我在Python中编写了两个绘图代码,单独运行前两段代码时可正常渲染出对应的两个图形,但尝试将这两个图形上下排列制作垂直子图时,Python生成了不符合预期的异常图像。
原始代码
数据定义
K1 = 1 K2 = [[0. 0. 0.] [0. 3. 0.] [0. 0. 0.]]
单独绘图代码(可正常运行)
# 绘制K1的图形 plt.clf() plt.imshow([[K1, K1], [K1, K1]], cmap='viridis') plt.colorbar() plt.show()
# 绘制K2的图形 plt.clf() plt.imshow(K2, cmap='viridis') plt.colorbar() plt.show()
错误的子图绘制代码
# 尝试制作垂直子图(生成异常图像) plt.clf() plt.imshow([[K1, K1], [K1, K1]], cmap='viridis') plt.colorbar() plt.subplot(2, 1, 1) plt.clf() plt.imshow(K2, cmap='viridis') plt.colorbar() plt.subplot(2, 1, 2) plt.show()
问题分析
你的代码存在三个核心问题:
- 子图创建顺序错误:应该先创建子图坐标轴,再在对应坐标轴上绘制内容。你先绘制图像再调用
plt.subplot(),会导致之前的绘图被新创建的子图轴覆盖。 - 重复清空绘图区域:两次调用
plt.clf()会清空整个画布,第一次绘制的内容直接被删除,最终只保留最后一次的绘图操作。 - 颜色条布局冲突:直接使用
plt.colorbar()会默认绑定到当前最后一个轴,且没有考虑子图布局,导致颜色条挤压子图空间,甚至覆盖内容。
修正后的代码
import matplotlib.pyplot as plt K1 = 1 K2 = [[0. 0. 0.] [0. 3. 0.] [0. 0. 0.]] # 创建2行1列的子图布局,获取两个轴对象 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 8)) # 在第一个子图绘制K1的内容 im1 = ax1.imshow([[K1, K1], [K1, K1]], cmap='viridis') # 为第一个子图添加颜色条,指定绑定的轴 fig.colorbar(im1, ax=ax1) # 在第二个子图绘制K2的内容 im2 = ax2.imshow(K2, cmap='viridis') # 为第二个子图添加颜色条 fig.colorbar(im2, ax=ax2) # 调整子图间距,避免重叠 plt.tight_layout() plt.show()
说明
- 使用
plt.subplots()一次性创建所有子图,直接获取每个子图的轴对象,确保绘图内容对应到正确的子图。 - 每个颜色条通过
fig.colorbar()指定对应的轴,避免布局冲突。 - 调用
plt.tight_layout()自动调整子图和颜色条的间距,保证布局美观。
内容的提问来源于stack exchange,提问作者user12581768
相关产品推荐
相关产品推荐

