How to control the legend in Seaborn - Python

时光毁灭记忆、已成空白 提交于 2019-12-08 13:29:19

问题


I am trying to find guidance on how to control and customize the legend in Seaborn plots but I can not find any.

To make the issue more concrete I provide a reproducible example:

surveys_by_year_sex_long

    year    sex wgt
0   2001    F   36.221914
1   2001    M   36.481844
2   2002    F   34.016799
3   2002    M   37.589905

%matplotlib inline
from matplotlib import *
from matplotlib import pyplot as plt
import seaborn as sn

sn.factorplot(x = "year", y = "wgt", data = surveys_by_year_sex_long, hue = "sex", kind = "bar", legend_out = True,
             palette = sn.color_palette(palette = ["SteelBlue" , "Salmon"]), hue_order = ["M", "F"])
plt.xlabel('Year')
plt.ylabel('Weight')
plt.title('Average Weight by Year and Sex')

In this example I would like to be able to define M as Male and F as Female and instead of sex to have Sex as title of the legend.

Your advice will be appreciated.


回答1:


First, to access the legend created by seaborn needs to be done via the seaborn call.

g = sns.factorplot(...)
legend = g._legend

This legend can then be manipulated,

legend.set_title("Sex")
for t, l in zip(legend.texts,("Male", "Female")):
    t.set_text(l)

The result is not totally pleasing because the strings in the legend are larger than previously, hence the legend would overlap the plot

One would hence also need to adjust the figure margins a bit,

g.fig.subplots_adjust(top=0.9,right=0.7)




回答2:


I've always found changing labels in seaborn plots once they are created to be a bit tricky. The easiest solution seems to be to change the input data itself, by mapping the values and column names. You can create a new dataframe as follows, then use the same plot commands.

data = surveys_by_year_sex_long.rename(columns={'sex': 'Sex'})
data['Sex'] = data['Sex'].map({'M': 'Male', 'F': 'Female'})
sn.factorplot(
    x = "year", y = "wgt", data = data, hue = "Sex",
    kind = "bar", legend_out = True,
    palette = sn.color_palette(palette = ["SteelBlue" , "Salmon"]),
    hue_order = ["Male", "Female"])

Hopefully this does what you need. The potential problem is that if the dataset is large, creating a whole new dataframe in this manner adds some overhead.



来源:https://stackoverflow.com/questions/47542104/how-to-control-the-legend-in-seaborn-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!