将 seaborn 图例移至其他位置
- 2025-01-20 09:07:00
- admin 原创
- 77
问题描述:
我正在使用factorplot(kind="bar")
seaborn。
除了图例放错了位置之外,情节很好:太靠右了,文本超出了情节的阴影区域。
我如何让 seaborn 将图例放置在其他地方,比如左上角而不是右中角?
解决方案 1:
基于@user308827 的回答:您可以legend=False
在 factorplot 中使用并通过 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:
对于
seaborn >= 0.11.2
使用seaborn.move_legend
,适用于轴和图形级图,它接受kwargs
,如title
请参阅
matplotlib.axes.Axes.legend
如何将图例从图中取出以了解参数及其用法。
原始问题询问的是
sns.factorplot
,现已重命名为seaborn.catplot
,图形级图。对于
g = sns.jointplot
或g = sns.JointGrid
,图例在g.ax_joint
,而不是g
。sns.move_legend(g.ax_joint)
请参阅如何从 seaborn JointGrid 或 jointplot 中移动或删除图例。
.move_legend
用于移动图例,而不是更改图例标题或标签。这应该通过清理数据来完成。在 中
pandas
,有多种方法可以更改列名和列中的字符串值,例如.rename
、 和.map
。
已在
python 3.10
,pandas 1.5.0
,matplotlib 3.5.2
,测试seaborn 0.12.0
请参阅如何使用 Seaborn 0.12 对象自定义图例?
seaborn.object
以使用在 中首次亮相的新界面重新定位图例seaborn 0.12.0
。
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()
解决方案 3:
在此处查看文档:https://matplotlib.org/users/legend_guide.html#legend-location
添加这个只是为了让传奇故事脱离情节:
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
解决方案 4:
修改此处的示例:
您可以使用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")
解决方案 5:
这就是我如何将图例移动到情节内的特定位置并改变情节的外观和大小:
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这里的回答和 Fernando Hernandez这里的回答中找到了这一点。
解决方案 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.)
解决方案 8:
使用面向对象的API:
fig,ax = plt.subplots(1,1)
sns.someplot(...,ax=ax)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels,loc="upper left")
来源:https ://matplotlib.org/stable/tutorials/intermediate/legend_guide.html