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

如何调整Matplotlib中subplots布局下各子图的尺寸?

问题描述
  • 现有一段绘制3张子图的Matplotlib代码,能正常运行但子图尺寸过小,显示拥挤:
plt.subplot(1,3,1) 

plt.bar(dias_creacion.index,dias_creacion)
plt.xticks(np.arange(7),('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'),rotation=45)
plt.title('Días de creación')

plt.subplot(1,3,2)

plt.bar(dias_primera_conversion.index,dias_primera_conversion)
plt.xticks(np.arange(7),('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'),rotation=45)
plt.title('Primeras conversiones')

plt.subplot(1,3,3)

plt.bar(dias_ultima_conversion.index,dias_ultima_conversion)
plt.xticks(np.arange(7),('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'),rotation=45)
plt.title('Ultimas conversiones')

plt.show()
  • 尝试以下调整但未生效:
plt.subplot(1,3,1) 
plt.figure(figsize=(10,10))
plt.bar(dias_creacion.index,dias_creacion)
plt.xticks(np.arange(7),('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'),rotation=45)
plt.title('Días de creación') 
  • 疑问:如何正确调整每个子图的尺寸?
解决方案

你的问题出在创建画布的时机错误:plt.figure()需要在创建子图(plt.subplot())之前调用,否则它会生成新的空白画布,之前的子图不会在这个新画布上显示,尺寸调整自然无效。

下面是两种正确的调整方式:

方法1:先创建画布再逐个添加子图

先通过plt.figure(figsize=(宽度, 高度))设置整个画布的尺寸,画布会自动分配空间给子图,子图尺寸会随画布放大适配:

# 先设置画布尺寸,比如宽15、高5,适配横向3张子图的布局
plt.figure(figsize=(15, 5))

plt.subplot(1,3,1) 
plt.bar(dias_creacion.index,dias_creacion)
plt.xticks(np.arange(7),('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'),rotation=45)
plt.title('Días de creación')

plt.subplot(1,3,2)
plt.bar(dias_primera_conversion.index,dias_primera_conversion)
plt.xticks(np.arange(7),('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'),rotation=45)
plt.title('Primeras conversiones')

plt.subplot(1,3,3)
plt.bar(dias_ultima_conversion.index,dias_ultima_conversion)
plt.xticks(np.arange(7),('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'),rotation=45)
plt.title('Ultimas conversiones')

# 自动调整子图间距,避免标签、标题重叠
plt.tight_layout()
plt.show()

方法2:使用plt.subplots()规范创建子图

这种方式直接获取画布和子图对象,更灵活控制布局与尺寸:

# 创建1行3列的子图,同时设置画布尺寸,返回画布和子图数组
fig, axs = plt.subplots(1, 3, figsize=(15, 5))

# 配置第一个子图
axs[0].bar(dias_creacion.index,dias_creacion)
axs[0].set_xticks(np.arange(7))
axs[0].set_xticklabels(('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'), rotation=45)
axs[0].set_title('Días de creación')

# 配置第二个子图
axs[1].bar(dias_primera_conversion.index,dias_primera_conversion)
axs[1].set_xticks(np.arange(7))
axs[1].set_xticklabels(('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'), rotation=45)
axs[1].set_title('Primeras conversiones')

# 配置第三个子图
axs[2].bar(dias_ultima_conversion.index,dias_ultima_conversion)
axs[2].set_xticks(np.arange(7))
axs[2].set_xticklabels(('Lunes','Martes','Miercoles','Jueves','Viernes','Sabado','Domingo'), rotation=45)
axs[2].set_title('Ultimas conversiones')

plt.tight_layout()
plt.show()

额外提示

  • figsize的单位是英寸,横向子图建议设置更大的宽度(比如15),避免坐标轴标签拥挤。
  • plt.tight_layout()会自动调整子图间距与边距,解决标签、标题重叠问题,非常实用。

内容的提问来源于stack exchange,提问作者Diego González Castellanos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:45:47