Seaborn子图图例布局与标题字号调整问题求助
Seaborn并排子图:图例布局与字体大小调整解决方案
嘿,我来帮你搞定这两个并排子图的问题!咱们一个个捋清楚:
一、图例位置异常的修复
你当前用plt.legend()设置图例,但在子图布局下,全局的plt.legend()容易和子图的轴对象冲突,导致图例位置混乱。正确的做法是针对每个子图的轴对象单独配置图例:
- 调用
sns.boxplot()时会返回对应的轴对象(ax),直接用这个对象调用legend()方法 - 通过
bbox_to_anchor参数把图例放到子图右侧的外部区域,同时调整plt.subplots_adjust的right参数,给图例留出足够显示空间
二、标题与坐标轴字体大小的调整
之前字体设置无效,是因为你没直接绑定子图的轴对象进行配置。可以通过两种方式实现:
- 给
set_title()、tick_params()方法传入字体大小参数,精准控制标题和刻度字体 - 使用
fontdict字典一次性设置标题的字体样式(比如大小、粗细)
如果想统一所有子图的字体风格,也可以先通过plt.rcParams做全局设置。
三、关于子图创建方式的疑问
你用plt.subplots(1, 2)创建并排子图的方式完全正确!问题不是出在子图创建上,而是后续的图例和字体设置用了全局的plt方法,没有绑定到对应的子图轴对象,才导致效果不符合预期。
修改后的完整代码
import matplotlib.pyplot as plt import seaborn as sns # 可选:全局统一字体大小,让所有元素风格一致 plt.rcParams['font.size'] = 12 # 创建1行2列的子图,提前设置画布大小让布局更合理 f, axes = plt.subplots(1, 2, figsize=(12, 6)) # 第一个子图:性别内自我认知排名 ax1 = sns.boxplot( x='Treatment', y='Believed Rank within own Gender', data=df_fig, hue="sex", palette='vlag_r', ax=axes[0] ) ax1.set_title("Beliefed Rank within own Gender", fontsize=14) # 设置标题字体大小 ax1.tick_params(axis='both', labelsize=10) # 设置坐标轴刻度字体大小 # 把图例放到子图右侧外部 ax1.legend(title="Sex", bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0., fancybox=True) # 第二个子图:组内自我认知排名 ax2 = sns.boxplot( x='Treatment', y='Believed Rank', data=df_fig[df_fig["Period"]==4], hue="sex", palette='vlag_r', ax=axes[1] ) ax2.set_title("Beliefed Rank within own Group", fontsize=14) ax2.tick_params(axis='both', labelsize=10) # 同样把图例放到子图右侧外部 ax2.legend(title="Sex", bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0., fancybox=True) # 调整子图间距,给右侧图例留出足够空间 plt.subplots_adjust(left=0.08, bottom=0.15, right=0.85, top=0.9, wspace=0.3) plt.show()
代码说明
- 每个子图用单独的轴对象(
ax1、ax2)操作,避免全局方法的冲突 bbox_to_anchor=(1.02, 1)精准把图例定位到子图右上角的外部区域set_title()和tick_params()分别控制标题和刻度的字体大小,确保在子图布局下生效- 调整了
subplots_adjust的参数,让整体布局更美观,同时给图例留出足够显示空间
内容的提问来源于stack exchange,提问作者rosa
相关产品推荐
相关产品推荐

