如何通过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()
关键修改点说明
- 用
axes.flatten()处理子图轴:把2行4列的二维轴数组转成一维,这样可以直接和8个字母一一对应遍历。 - 针对每个轴对象绘图:用
ax.imshow()、ax.set_title()等方法替代全局的plt函数,确保每个热力图画在对应的子图里。 - 为每个子图单独加颜色条:通过
fig.colorbar()指定对应的ax,并调整fraction和pad参数避免颜色条和子图重叠。 - 添加
plt.tight_layout():自动调整子图间距,让所有标签、标题都能正常显示,不会互相遮挡。
这样运行后就能得到你想要的2行4列共8个热力图子图啦~
内容的提问来源于stack exchange,提问作者sachikox
相关产品推荐
相关产品推荐

