使用matplotlib绘制多子图时输出被遮挡无法正常显示的问题
代码异常根因
两处硬错误直接导致子图堆叠、阴影遮挡的显示问题:
- 方法名写错:本来要用来切换单绘图轴的
plt.subplot(),结果写成了带s的plt.subplots()。后者的作用是一次性创建整张子图网格,传入131作为参数会被当成「131行、1列」的超大网格,直接把整个画布布局逻辑搞乱。 - 参数传错位置:第一次调pandas的
.plot.bar()时塞了figsize=(24,6),这个参数是给整个画布用的,传给pandas绘图方法会触发内部逻辑自动新建独立画布,根本不会用到你之前指定的子图轴,最后所有条形图全堆在同一个显示区域,叠出阴影效果。
修正方案
兼容原有逻辑的快速改法
把原来写错的方法名修正,提前在画布初始化时设置尺寸,绘图时不再传递figsize参数:
# 初始化画布时直接指定全局尺寸 plt.figure(figsize=(24,6)) # 注意这里用无s的plt.subplot,传入三位数位置参数指定子图位置 plt.subplot(131) train['Dependents'].value_counts(normalize=True).plot.bar(title='Dependents') plt.subplot(132) train['Education'].value_counts(normalize=True).plot.bar(title='Education') plt.subplot(133) train['Property_Area'].value_counts(normalize=True).plot.bar(title='Property_Area') # 自动调整子图边距,避免标签遮挡 plt.tight_layout() plt.show()
更稳定的规范写法
直接一次性创建全部子图轴,显式指定绘图的目标轴,从根源上避免激活轴错位的问题:
# 一次性创建1行3列的子图网格,直接拿到所有轴对象 fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(24,6)) # 通过ax参数显式指定每个条形图要画到哪个轴上 train['Dependents'].value_counts(normalize=True).plot.bar(ax=axes[0], title='Dependents') train['Education'].value_counts(normalize=True).plot.bar(ax=axes[1], title='Education') train['Property_Area'].value_counts(normalize=True).plot.bar(ax=axes[2], title='Property_Area') plt.tight_layout() plt.show()
注意事项
- 别把
figsize往pandas的.plot()方法里塞,这个参数触发的新建画布逻辑是这类子图错位问题的最常见踩坑点 - 两个长得像的matplotlib方法别再搞混:
plt.subplot():用来切当前正在用的绘图轴,支持131、221这类三位数的位置简写plt.subplots():用来一次性把所有子图轴都建好,参数是分开的nrows/ncols,不认三位数的位置简写
- 加
plt.tight_layout()可以自动给子图留边距,不会出现标题、坐标轴互相遮挡的问题
内容的提问来源于stack exchange,提问作者Mayor
相关产品推荐
相关产品推荐

