如何在for循环中为matplotlib子图设置对应分组的自定义标题
解决方案
你可以直接利用groupby返回的分组键生成标题,也可以提前定义有序标题列表匹配分组顺序,两种实现方式如下:
方法1:直接用分组键生成标题
你调用groupby后迭代得到的每个group是(分组键, 分组数据)的元组,第一个元素就是对应的P1/P2/P3,直接提取拼接为目标标题即可:
fig, axs = plt.subplots(nrows=1, ncols=3, # 你原有代码ncols=5多余,仅3个分组改设为3即可避免空子图 figsize=(10, 3)) groups = df.groupby(level=1, axis=1) for ax, (param_key, group_df) in zip(axs.flatten(), groups): group_df.plot(kind='bar', ax=ax, color=['b', 'g', 'r'], sharey=True, legend=False, rot=True) # 从分组键P1/P2/P3中截取数字,拼接为目标标题 param_num = param_key.strip('P') ax.set_title(f'Parameter {param_num}') # 自动调整子图间距,避免标题重叠 plt.tight_layout() plt.show()
方法2:提前定义自定义标题列表
如果需要完全自定义标题内容,不需要依赖分组键,可以提前定义和分组顺序一致的标题列表,在循环中匹配调用:
# 提前定义有序标题,顺序对应P1、P2、P3 title_list = ['Parameter 1', 'Parameter 2', 'Parameter 3'] fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(10, 3)) groups = df.groupby(level=1, axis=1) for ax, (_, group_df), title in zip(axs.flatten(), groups, title_list): group_df.plot(kind='bar', ax=ax, color=['b', 'g', 'r'], sharey=True, legend=False, rot=True) ax.set_title(title) plt.tight_layout() plt.show()
补充说明
- matplotlib子图设置标题的核心方法是
ax.set_title(标题字符串),直接在循环内对当前迭代的子图对象调用即可 - 如果你确实需要保留
ncols=5的设置,只需要对前3个有效子图设置标题即可,不会影响剩余空子图
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

