将 seaborn 情节图例移动到不同的位置

Posted

技术标签:

【中文标题】将 seaborn 情节图例移动到不同的位置【英文标题】:Move seaborn plot legend to a different position 【发布时间】:2015-01-17 02:28:31 【问题描述】:

我正在使用 factorplot(kind="bar") 和 seaborn。

情节很好,只是图例放错了位置:太靠右了,文字超出了情节的阴影区域。

如何让 seaborn 将图例放置在其他位置,例如左上角而不是右中角?

【问题讨论】:

对于seaborn >= 0.11.2,使用.move_legend,如answer所示 【参考方案1】:

基于@user308827 的回答:您可以在factorplot 中使用legend=False 并通过matplotlib 指定图例:

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")

titanic = sns.load_dataset("titanic")

g = sns.factorplot("class", "survived", "sex",
                   data=titanic, kind="bar",
                   size=6, palette="muted",
                   legend=False)
g.despine(left=True)
plt.legend(loc='upper left')
g.set_ylabels("survival probability")
plt 作用于当前轴。要从 FacetGrid 获取轴,请使用图。 g.fig.get_axes()[0].legend(loc='lower left')

【讨论】:

【参考方案2】:

在此处查看文档:https://matplotlib.org/users/legend_guide.html#legend-location

添加这个只是为了将传奇带出情节:

plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

【讨论】:

【参考方案3】:

修改示例here:

你可以使用legend_out = False

import seaborn as sns
sns.set(style="whitegrid")

titanic = sns.load_dataset("titanic")

g = sns.factorplot("class", "survived", "sex",
                    data=titanic, kind="bar",
                    size=6, palette="muted",
                   legend_out=False)
g.despine(left=True)
g.set_ylabels("survival probability")

【讨论】:

【参考方案4】:

这就是我能够将图例移动到绘图内的特定位置并更改绘图的方面和大小的方法:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
import seaborn as sns
sns.set(style="ticks")

figure_name = 'rater_violinplot.png'
figure_output_path = output_path + figure_name

viol_plot = sns.factorplot(x="Rater", 
                       y="Confidence", 
                       hue="Event Type", 
                       data=combo_df, 
                       palette="colorblind",
                       kind='violin',
                       size = 10,
                       aspect = 1.5,
                       legend=False)

viol_plot.ax.legend(loc=2)
viol_plot.fig.savefig(figure_output_path)  

这对我来说改变了情节的大小和方面以及将图例移到情节区域之外。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
import seaborn as sns
sns.set(style="ticks")


figure_name = 'rater_violinplot.png'
figure_output_path = output_path + figure_name

viol_plot = sns.factorplot(x="Rater", 
                       y="Confidence", 
                       hue="Event Type", 
                       data=combo_df, 
                       palette="colorblind",
                       kind='violin',
                       size = 10,
                       aspect = 1.5,
                       legend_out=True)

viol_plot.fig.savefig(figure_output_path)  

我从 mwaskom 的回答 here 和 Fernando Hernandez 的回答 here 中发现了这一点。

【讨论】:

【参考方案5】: 对于seaborn >= 0.11.2,使用seaborn.move_legend,它适用于轴和图形水平图,它接受kwargs,如title 有关参数及其用法,请参阅 matplotlib.axes.Axes.legend 和 How to put the legend out of the plot。 最初的问题是关于sns.factorplot,已重命名为seaborn.catplot,一个图形级别的情节。 python 3.8.11pandas 1.3.2matplotlib 3.4.3seaborn 0.11.2中测试
import matplotlib.pyplot as plt
import seaborn as sns

# load the data
penguins = sns.load_dataset('penguins', cache=False)

人物水平图

g = sns.displot(penguins, x="bill_length_mm", hue="species", col="island", col_wrap=2, height=3)
sns.move_legend(g, "upper left", bbox_to_anchor=(.55, .45), title='Species')
plt.show()

轴水平图

ax = sns.histplot(penguins, x="bill_length_mm", hue="species")
sns.move_legend(ax, "lower center", bbox_to_anchor=(.5, 1), ncol=3, title=None, frameon=False)
plt.show()

【讨论】:

【参考方案6】:

看来你可以直接调用:

g = sns.factorplot("class", "survived", "sex",
                data=titanic, kind="bar",
                size=6, palette="muted",
               legend_out=False)

g._legend.set_bbox_to_anchor((.7, 1.1))

【讨论】:

【参考方案7】:

如果您想自定义您的图例,只需使用add_legend 方法。它采用与 matplotlib plt.legend 相同的参数。

import seaborn as sns
sns.set(style="whitegrid")

titanic = sns.load_dataset("titanic")

g = sns.factorplot("class", "survived", "sex",
                    data=titanic, kind="bar",
                    size=6, palette="muted",
                   legend_out=False)
g.despine(left=True)
g.set_ylabels("survival probability")
g.add_legend(bbox_to_anchor=(1.05, 0), loc=2, borderaxespad=0.)

【讨论】:

这似乎创造了一个新的传奇。在我的代码中,我还有其他行来调整图例(标题、大小和透明度..)。如果我调用它来调整位置,那么以下几行不起作用......

以上是关于将 seaborn 情节图例移动到不同的位置的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn 色调和尺寸图例

Seaborn pairplot 图例 - 如何控制位置

Matplotlib:在图例中移动标记位置

你如何在 Seaborn 中为 kde 情节创造传奇?

当我将传奇移出情节时,传奇失去了第二位艺术家

Seaborn在图像内自定义图例(legend)位置实战