Matplotlib:如何为子图的每行添加共享标题?
为Matplotlib每行子图添加共享标题
现有代码:
fig, ax = plt.subplots(nrows=3, ncols=2, figsize=(10,10)) for i in range(0, 3): # Left plot ax[i,0].plot(data1[i].x, data1[i].y) # Right plot ax[i,1].plot(data2[i].x, data2[i].y)
这段代码生成3行2列共6个子图,目前仅能为每个轴单独设置标题,请问是否可以为每行子图添加共享标题?
当然可以,以下是几种实用的实现方式:
方法1:手动用fig.text()定位行标题
通过计算每行的垂直位置,在两个子图上方居中添加文本作为共享标题:
fig, ax = plt.subplots(nrows=3, ncols=2, figsize=(10,10)) row_titles = ["第一行标题", "第二行标题", "第三行标题"] for i in range(3): # 绘制子图 ax[i,0].plot(data1[i].x, data1[i].y) ax[i,1].plot(data2[i].x, data2[i].y) # 添加行共享标题 fig.text(0.5, 0.92 - i*0.3, row_titles[i], ha='center', va='center', fontsize=12, weight='bold') plt.tight_layout() plt.show()
0.5是水平居中位置,0.92 - i*0.3是垂直位置,可根据实际布局调整数值。
方法2:用GridSpec精准控制布局
如果需要更灵活的间距管理,用GridSpec预留标题区域:
import matplotlib.gridspec as gridspec fig = plt.figure(figsize=(10,12)) # 定义6行2列网格:3行标题位+3行子图位,设置高度比例 gs = gridspec.GridSpec(6, 2, height_ratios=[1, 4, 1, 4, 1, 4], hspace=0.3) row_titles = ["第一行标题", "第二行标题", "第三行标题"] for i in range(3): # 创建每行的两个子图 ax_left = fig.add_subplot(gs[2*i+1, 0]) ax_right = fig.add_subplot(gs[2*i+1, 1]) ax_left.plot(data1[i].x, data1[i].y) ax_right.plot(data2[i].x, data2[i].y) # 将标题放在对应行的预留位置 fig.text(0.5, gs[2*i].midpoint, row_titles[i], ha='center', va='center', fontsize=12, weight='bold') plt.show()
这种方式无需手动计算坐标,标题与子图的间距更可控。
方法3:偏移子图标题实现共享
给每行第一个子图设置标题,通过偏移让它覆盖两个子图的上方:
fig, ax = plt.subplots(nrows=3, ncols=2, figsize=(10,10), sharex=True, sharey=True) row_titles = ["第一行标题", "第二行标题", "第三行标题"] for i in range(3): ax[i,0].plot(data1[i].x, data1[i].y) ax[i,1].plot(data2[i].x, data2[i].y) # 把标题向上偏移,居中到该行两个子图上方 ax[i,0].set_title(row_titles[i], y=1.1, ha='center') # 隐藏右侧子图的默认标题 ax[i,1].set_title("") plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者There
相关产品推荐
相关产品推荐

