如何移除Matplotlib子图中文本下方的多余空白
解决Matplotlib子图多余空白的问题
针对子图无法贴合Logo、标题及文本内容的问题,可通过以下调整消除多余空白,同时保留原有文本布局:
1. 移除Logo与标题子图的边距
对于已隐藏坐标轴的子图,直接清除内部边距,让内容紧贴子图边界:
- 在Logo子图的
imshow操作后添加边距清除代码 - 标题子图隐藏坐标轴后同样清除边距
2. 收缩文本子图的显示范围
文本子图的空白源于默认轴范围过大,通过调整轴上下限匹配文本实际位置,同时隐藏所有边框:
- 隐藏所有方向的spine(包括上下边框)
- 清除子图边距,设置y轴范围刚好覆盖文本的上下边界
3. 优化Gridspec行高比例
调整右侧网格的行高比例,让Logo/标题行、文本行的高度分配更贴合内容尺寸,避免冗余空间
修改后的完整代码片段
# ---- RIGHT COLUMN: 6 rows ---- # 调整行高比例,让Logo/标题行、文本行的高度更适配内容 gs_right = gs_main[1].subgridspec(6, 1, hspace=0.0, height_ratios=[1, 2, 1, 1, 1, 1]) # ------------------------------------------------------------ ## Logo & Title gs_1 = gs_right[0].subgridspec(1, 2, width_ratios=[1, 3]) ax_logo = fig.add_subplot(gs_1[0]) ax_logo.axis("off") logo = mpimg.imread("path/to/logo") ax_logo.imshow(logo) ax_logo.margins(0) # 清除Logo子图的所有边距 ax_title = fig.add_subplot(gs_1[1]) ax_title.text(0, 0.5, "Title\n", fontsize=12, fontweight="bold", va="center", ha="left") ax_title.axis("off") ax_title.margins(0) # 清除标题子图的所有边距 # ------------------------------------------------------------ # ax_2: Text ax_2 = fig.add_subplot(gs_right[1]) ax_2.tick_params(left=False, bottom=False, labelleft=False, labelbottom=False) # 隐藏所有方向的边框 for direction in ["left", "right", "top", "bottom"]: ax_2.spines[direction].set_visible(False) ax_2.margins(0) # 清除文本子图的边距 # 设置y轴范围,刚好覆盖文本的上下位置(可根据实际文本坐标微调) ax_2.set_ylim(0.55, 0.95) ax_2.text(0.5, 0.9, "Text1", ha="center", va="center", fontsize=14, fontweight="bold") ax_2.text(0.5, 0.8, "Text2", ha="center", va="center", fontsize=12, fontweight="bold") ax_2.text(0.5, 0.7, "Text3", ha="center", va="center", fontsize=10, fontweight="bold") ax_2.text(0.5, 0.6, "Text4", ha="center", va="center", fontsize=10)
额外提示
若整体布局仍有冗余空白,可在创建Figure时添加constrained_layout=True参数(如fig = plt.figure(constrained_layout=True)),Matplotlib会自动优化子图间距,进一步减少不必要的空白。
内容的提问来源于stack exchange,提问作者stbr2
相关产品推荐
相关产品推荐

