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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:15:38