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

如何通过for循环为Matplotlib图表添加8个热力图子图?

解决Matplotlib 2行4列热力图子图的问题

我来帮你搞定这个8个热力图子图的生成问题~你的代码里有几个关键问题导致子图没法正确显示,咱们一步步修正:

你的代码核心问题

  • 重复创建画布:你先手动创建了fig = plt.figure(figsize=(12,8)),之后又用plt.subplots(2,4)重新生成了画布,这会导致第一个画布被覆盖,多余且没用。
  • plt.clf()清空整个画布:每次循环都调用这个方法,会把之前创建的所有子图都清空,最后只能看到最后一次循环生成的图。
  • 没有指定子图轴对象:你用plt.imshow()这类全局函数绘图,所有内容都会画在同一个轴上,而不是对应到ax_lst里的每个子图轴。

修正后的完整代码

import matplotlib.pyplot as plt
import numpy as np

# 直接创建2行4列的子图网格,同时指定画布尺寸
fig, axes = plt.subplots(2, 4, figsize=(12, 8))
# 将2x4的轴数组展平成一维,方便循环遍历
axes = axes.flatten()
letters = "ABCDEFGH"

# 同时遍历字母和对应的子图轴
for ax, char in zip(axes, letters):
    # 生成随机数据
    x = np.random.randn(4096)
    y = np.random.randn(4096)
    # 计算二维直方图数据
    heatmap, xedges, yedges = np.histogram2d(x, y, bins=(64, 64))
    extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
    
    # 在当前子图轴上绘制热力图
    im = ax.imshow(heatmap, extent=extent)
    # 设置子图标题、坐标轴标签
    ax.set_title(f"Heatmap {char}")
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    # 为每个子图添加颜色条,调整位置避免重叠
    fig.colorbar(im, ax=ax, fraction=0.046, pad=0.04)

# 调整子图间距,避免标签和标题重叠
plt.tight_layout()
plt.show()

关键修改点说明

  1. 用axes.flatten()处理子图轴:把2行4列的二维轴数组转成一维,这样可以直接和8个字母一一对应遍历。
  2. 针对每个轴对象绘图:用ax.imshow()、ax.set_title()等方法替代全局的plt函数,确保每个热力图画在对应的子图里。
  3. 为每个子图单独加颜色条:通过fig.colorbar()指定对应的ax,并调整fraction和pad参数避免颜色条和子图重叠。
  4. 添加plt.tight_layout():自动调整子图间距,让所有标签、标题都能正常显示,不会互相遮挡。

这样运行后就能得到你想要的2行4列共8个热力图子图啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:52:29