在 seaborn 中编辑标签和移动图例

Edit labels and move legend in seaborn

我有一个 seaborn 散点图,我想更改它的标签并将图例移到图表之外。有很多解决方案可以解决每个问题,但我无法同时解决这两个问题。改编自 Whosebug 中用于 sns.lmplot:

的解决方案
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")

g = sns.scatterplot(x="total_bill", y="tip", hue="smoker", data=tips, legend=False)

plt.legend(title='Smoker', bbox_to_anchor=(1.05, 1), labels=['Hell Yeh', 'Nah Bruh'])
plt.show(g) 

此处legend=False 由 matplotlib 稍后定义。问题是该图仅显示第一个标签,而不显示图例中的其余标签。

我试过另一种修改标签的方法legend='full',后来修改:

g = sns.scatterplot(x="total_bill", y="tip", hue="smoker", data=tips, legend='full')

h,l = g.get_legend_handles_labels()
l = ['Smoking behaviors:','Hell Yeh', 'Nah Bruh']
g.legend(h, l)

但命令 g.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 无法正常工作,编辑的标签也不会显示。仅显示原始标签。

所以,我可以分别解决这两个问题,但不能同时解决。

在当前版本的 Seaborn 散点图 (0.11.1) 中,您可以先创建完整的图例,然后再次调用 ax.legend() 进行更改。

请注意,sns.scatterplot 的 return 值是一个 ax,因为它是一个 axis-level function。这不应与图形级函数混淆,后者 return 一个完整的“轴”网格,通常写为 g = sns....

不同的 seaborn 函数以不同的方式创建图例。根据所使用的选项,图例可能会变得相当复杂且不易更改。让图例更容易修改是 Seaborn 未来开发计划中的计划。

from matplotlib import pyplot as plt
import seaborn as sns

tips = sns.load_dataset('tips')
ax = sns.scatterplot(x="total_bill", y="tip", hue="smoker", data=tips, legend='full')
ax.legend(title='Smoker', bbox_to_anchor=(1.05, 1), labels=['Hell Yeh', 'Nah Bruh'])
plt.tight_layout()
plt.show()