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

使用Matplotlib循环创建子图时axs[i]被识别为元组的报错问题

问题原因与解决方法

错误根源

  1. Axes对象被覆盖:axs[i] = plt.hist(random_variables)这行代码把原本存储的子图Axes对象,替换成了plt.hist的返回值——一个包含直方图频数、区间边界、图形元素的元组。后续调用set_ylabel时,自然会触发“元组无此方法”的错误。
  2. 绘图目标错误:plt.hist默认在当前活跃的子图上绘图,循环中每次调用都会把内容画到最后一个子图,导致三次数据全部叠加在第三个直方图里。

修正后的代码

import matplotlib.pyplot as plt
import scipy.stats

fig, axs = plt.subplots(3, 1, sharex=True)
axs = axs.ravel()

for i, n in enumerate([100, 1000, 10000]):
    random_variables = scipy.stats.norm.rvs(loc=10, scale=3, size=n)
    # 直接用子图轴对象的hist方法绘制,不覆盖Axes引用
    axs[i].hist(random_variables)
    axs[i].set_ylabel('出现次数')

# 共享x轴时,给最后一个子图设置x标签即可
axs[-1].set_xlabel('随机样本取值')

plt.tight_layout()
plt.show()

关键修改说明

  • 改用Axes对象的hist方法:axs[i].hist()直接在指定子图上绘制直方图,不会修改axs[i]存储的Axes对象,后续的set_ylabel就能正常调用。
  • 简化循环逻辑:用enumerate遍历样本量列表,自动获取索引i,省去手动维护计数器的麻烦。
  • 正确设置x轴标签:因为开启了sharex=True,所有子图共享x轴,只需给最后一个子图设置x标签;也可以用fig.supxlabel('随机样本取值')添加全局x轴标签,效果更统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:25:16