Matplotlib多子图行标题添加:如何为每行子图设置居中标题
如何为Matplotlib多行子图添加每行的行标题?
这个问题很常见——当你需要给多行子图添加各自的行标题时,plt.suptitle显然满足不了需求,因为它是整个图表的总标题,多次调用只会覆盖之前的内容,而且它的位置是相对于整个画布的,无法精准对应到每行子图的上方。
这里有个高效且易维护的解决方案,通过遍历子图行、计算每行的中心位置来添加行标题,同时还能简化子图独立标题的设置:
import matplotlib.pyplot as plt # 创建3行4列的子图,获取二维axes数组(比手动拆分成单个ax变量更灵活) fig, axes = plt.subplots(3, 4, figsize=(12, 8)) # 批量设置每个子图的独立标题,不用逐个写ax1/ax2... for row_idx, ax_row in enumerate(axes): for col_idx, ax in enumerate(ax_row): ax.set_title(f'Fig{row_idx*4 + col_idx + 1}', ha='center') # 定义每行的标题文本 row_titles = ['Row 1', 'Row 2', 'Row 3'] # 遍历每行,添加行标题 for ax_row, title in zip(axes, row_titles): # 获取该行第一个和最后一个子图的左右边界,计算行中心x坐标 left_bound = ax_row[0].get_position().x0 right_bound = ax_row[-1].get_position().x1 center_x = (left_bound + right_bound) / 2 # 获取该行子图的顶部y位置,加上偏移量避免和子图标题重叠 top_y = ax_row[0].get_position().y1 + 0.02 # 在计算好的位置添加行标题 fig.text(center_x, top_y, title, ha='center', fontsize=14, fontweight='bold') # 自动调整布局,避免标题重叠 fig.tight_layout() plt.show()
这个方案的优势:
- 高效可扩展:不管你是3行还是更多行,只需要修改
row_titles列表和子图行数即可,不需要手动调整每个标题的位置 - 位置精准:通过子图的实际位置计算行中心,确保标题始终在每行子图的正上方
- 代码简洁:批量设置子图标题,避免重复编写
ax1.set_title()这类冗余代码
如果你需要更精细的布局控制,也可以使用matplotlib.gridspec.GridSpec来预留行标题的空间,但上面的方法已经足够解决大部分场景的需求,代码也更简洁直观。
内容的提问来源于stack exchange,提问作者user9639519
相关产品推荐
相关产品推荐

