如何替换Seaborn Relplot中的图例并移除原始图例
解决Seaborn Relplot中移除原始图例并保留自定义图例的问题
问题原因
你当前的代码中,sns.relplot会自动生成一个原始图例,后续调用plt.legend()又创建了新的自定义图例,导致两个图例共存。由于legend=False会完全禁用所有图例生成,无法单独保留自定义图例,因此需要针对FacetGrid对象的原始图例进行单独操作。
方法一:移除原始图例后添加自定义图例
先获取relplot返回的FacetGrid对象,移除其自带的原始图例,再创建并修改自定义图例:
import seaborn as sns import matplotlib.pyplot as plt # 保存relplot返回的FacetGrid实例 g = sns.relplot(data=df_R_subject1, x="CDL-07_CO2", y="CDL-07_Ta", size="freshair_S1", hue="posture_S1", sizes=(200, 50), alpha=.5, palette="muted", height=6) # 移除FacetGrid自带的原始图例 g._legend.remove() # 创建自定义图例并修改文本 L = plt.legend(bbox_to_anchor=(1, 0.35), frameon=False) L.get_texts()[0].set_text('Posture') L.get_texts()[1].set_text('Standing') L.get_texts()[2].set_text('Sitting') L.get_texts()[3].set_text('Do you need fresh air?') L.get_texts()[4].set_text('Yes') L.get_texts()[5].set_text('No change') plt.ylabel("Air temperature (°C)", fontsize=12) plt.xlabel("CO2 concentration (ppm)", fontsize=12) plt.show()
方法二:直接修改原始图例(更简洁)
无需额外创建图例,直接获取FacetGrid的原始图例对象,修改其文本和样式:
import seaborn as sns import matplotlib.pyplot as plt g = sns.relplot(data=df_R_subject1, x="CDL-07_CO2", y="CDL-07_Ta", size="freshair_S1", hue="posture_S1", sizes=(200, 50), alpha=.5, palette="muted", height=6) # 获取原始图例对象 legend = g._legend # 修改图例文本内容 legend.texts[0].set_text('Posture') legend.texts[1].set_text('Standing') legend.texts[2].set_text('Sitting') legend.texts[3].set_text('Do you need fresh air?') legend.texts[4].set_text('Yes') legend.texts[5].set_text('No change') # 调整图例位置与样式(可选) legend.set_bbox_to_anchor((1, 0.35)) legend.set_frame_on(False) plt.ylabel("Air temperature (°C)", fontsize=12) plt.xlabel("CO2 concentration (ppm)", fontsize=12) plt.show()
关键说明
sns.relplot返回的是FacetGrid对象,其自带的图例存储在_legend属性中,调用remove()可单独移除原始图例,不会影响后续创建的自定义图例。- 方法二更高效,直接复用原始图例结构,避免重复创建图例导致的冗余问题。
内容的提问来源于stack exchange,提问作者Yunni
相关产品推荐
相关产品推荐

