如何调整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
相关产品推荐
相关产品推荐

