使用Matplotlib循环创建子图时axs[i]被识别为元组的报错问题
问题原因与解决方法
错误根源
- Axes对象被覆盖:
axs[i] = plt.hist(random_variables)这行代码把原本存储的子图Axes对象,替换成了plt.hist的返回值——一个包含直方图频数、区间边界、图形元素的元组。后续调用set_ylabel时,自然会触发“元组无此方法”的错误。 - 绘图目标错误:
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
相关产品推荐
相关产品推荐

