如何为Matplotlib中子图的子组添加标题?
实现带两级标题的子图组
要给子图添加「单个子图标题+子组标题」的两级结构,不需要复杂的嵌套子图,直接用fig.text()添加组标题,或者用gridspec实现嵌套布局即可,以下是两种可行方案:
方法一:直接添加组标题(简单高效)
适合子图排列规整的场景,通过fig.text()在指定位置添加组标题,配合子图自身的标题实现两级结构:
import matplotlib.pyplot as plt import pandas as pd # 子图标题列表 title = ["子图1标题", "子图2标题", "子图3标题", "子图4标题"] # 模拟数据(替换为你的真实数据) df3 = pd.DataFrame({'x': range(10), 'y': range(10)}) df12 = pd.DataFrame({'x': range(10), 'y': range(10,20)}) df5 = pd.DataFrame({'x': range(10), 'y': range(20,30)}) df6 = pd.DataFrame({'x': range(10), 'signal': range(30,40)}) # 创建1行4列的子图布局 fig, axes = plt.subplots(1, 4, figsize=(16, 2.5)) # 添加组标题:根据子图位置调整x坐标,确保标题居中对应子组 fig.text(0.22, 1.02, 'A', fontsize=16, fontweight='bold', ha='center') fig.text(0.72, 1.02, 'B', fontsize=16, fontweight='bold', ha='center') # 绘制子图(保留你原有的逻辑) for i, df in enumerate([df3, df12, df5, df6]): axes[i].set_title(title[i]) if i != 3: df.plot(x='x', y='y', color='red', ax=axes[i], alpha=0.9, legend=None) else: df.plot(x='x', y='signal', color='red', ax=axes[i], alpha=0.9) axes[i].legend(loc="lower right", ncol=2, labels=["y"], fontsize=12) # 调整布局避免标题重叠,保存时用bbox_inches='tight'确保组标题不被裁切 plt.tight_layout() plt.savefig('子图组.png', bbox_inches='tight') plt.show()
关键说明
fig.text()的x坐标需要根据子图数量和分组情况微调,比如4个子图分成两组,每组两个,0.22和0.72是对应子组的中心位置;bbox_inches='tight'参数确保保存图片时不会裁切顶部的组标题;- 子图自身的标题通过
axes[i].set_title()设置,保持你原有逻辑即可。
方法二:嵌套子图布局(灵活适配复杂分组)
如果需要更复杂的分组(比如不同组的子图数量不同),可以用gridspec创建嵌套的子图布局,明确划分子组:
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import pandas as pd title = ["子图1标题", "子图2标题", "子图3标题", "子图4标题"] df3 = pd.DataFrame({'x': range(10), 'y': range(10)}) df12 = pd.DataFrame({'x': range(10), 'y': range(10,20)}) df5 = pd.DataFrame({'x': range(10), 'y': range(20,30)}) df6 = pd.DataFrame({'x': range(10), 'signal': range(30,40)}) fig = plt.figure(figsize=(16, 2.5)) # 创建1行2列的大网格,作为两个子组的容器 gs = gridspec.GridSpec(1, 2, width_ratios=[1,1]) # 第一个子组A:包含2个子图 gs_a = gridspec.GridSpecFromSubplotSpec(1, 2, subplot_spec=gs[0]) axes_a = [fig.add_subplot(gs_a[0,0]), fig.add_subplot(gs_a[0,1])] fig.text(0.25, 1.02, 'A', fontsize=16, fontweight='bold', ha='center') # 第二个子组B:包含2个子图 gs_b = gridspec.GridSpecFromSubplotSpec(1, 2, subplot_spec=gs[1]) axes_b = [fig.add_subplot(gs_b[0,0]), fig.add_subplot(gs_b[0,1])] fig.text(0.75, 1.02, 'B', fontsize=16, fontweight='bold', ha='center') # 合并所有子图轴对象 axes = axes_a + axes_b # 绘制子图(同原有逻辑) for i, df in enumerate([df3, df12, df5, df6]): axes[i].set_title(title[i]) if i != 3: df.plot(x='x', y='y', color='red', ax=axes[i], alpha=0.9, legend=None) else: df.plot(x='x', y='signal', color='red', ax=axes[i], alpha=0.9) axes[i].legend(loc="lower right", ncol=2, labels=["y"], fontsize=12) plt.tight_layout() plt.savefig('嵌套子图组.png', bbox_inches='tight') plt.show()
关键说明
gridspec.GridSpec创建大的分组容器,GridSpecFromSubplotSpec在容器内创建子图网格;- 这种方式可以灵活调整每个子组的子图数量、比例,适合非对称的分组布局。
内容的提问来源于stack exchange,提问作者Philippe Maisonneuve
相关产品推荐
相关产品推荐

