You need to enable JavaScript to run this app. 使用matplotlib绘制多子图时输出被遮挡无法正常显示的问题
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 11:57:03