如何绘制带公共坐标轴标签与x轴下方公共图例的Matplotlib子图?
解决Matplotlib 2×2子图公共标签与图例问题
针对你遇到的公共y轴标签重叠、子图与标签间距过大、图例超出页面的问题,以下是修正后的实现方案,同时设置了适合打印和保存的图尺寸:
import numpy as np import matplotlib.pyplot as plt # 生成数据 x = np.linspace(0, 2 * np.pi, 400) y = np.sin(x ** 2) z = np.sin((1.03 * x) ** 2) # 创建2×2子图,设置适合打印的尺寸(8×6英寸,可按需调整) fig, axs = plt.subplots(2, 2, figsize=(8, 6)) # 绘制子图内容 axs[0, 0].plot(x, y) axs[0, 0].plot(x, z, '--') axs[0, 1].plot(x, y) axs[0, 1].plot(x, z, '--') axs[1, 0].plot(x, -y) axs[1, 0].plot(x, -z, '--') axs[1, 1].plot(x, -y) axs[1, 1].plot(x, -z, '--') # 设置公共x、y轴标签,通过labelpad控制间距避免过大空隙 fig.supxlabel("The X label", labelpad=15) fig.supylabel("The Y label", labelpad=20, x=0.06) # x参数调整y标签位置,避免与左侧刻度重叠 # 调整子图布局,为底部图例预留空间 fig.subplots_adjust(bottom=0.12) # 添加公共图例,调整位置确保完整显示 labels = ["A", "B"] fig.legend(labels, loc='lower center', ncol=len(labels), bbox_to_anchor=(0.5, 0.02)) # 自动调整子图布局,确保元素不重叠 fig.tight_layout(rect=[0, 0.05, 1, 0.98]) plt.show()
关键修正点说明:
- 图尺寸设置:通过
figsize=(8,6)定义适合打印的画布大小,可根据实际需求调整(如横向打印用(10,6))。 - 公共标签优化:使用
fig.supxlabel/supylabel替代隐藏子图方案,通过labelpad控制标签与子图的间距;调整supylabel的x参数,避免与左侧子图的长刻度标签重叠。 - 图例显示修复:通过
subplots_adjust(bottom=0.12)预留底部空间,同时调整bbox_to_anchor=(0.5, 0.02)将图例固定在页面内,配合tight_layout的rect参数进一步优化布局。 - 布局自动调整:
tight_layout(rect=[0,0.05,1,0.98])限定布局范围,确保所有元素(子图、标签、图例)都在画布内合理排列。
内容的提问来源于stack exchange,提问作者Esme_
相关产品推荐
相关产品推荐

