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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:01:38