Python 编辑seaborn图例

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/45201514/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 16:48:49  来源:igfitidea点击:

Edit seaborn legend

pythonmatplotliblegendseaborn

提问by Oliver G

Using a data frame and this code in Python, I was able to create a plot:

在 Python 中使用数据框和此代码,我能够创建一个图:

g = sns.lmplot('credibility', 'percentWatched', data=data, hue = 'millennial', markers = ["+", "."], x_jitter = True, y_jitter = True, size=5)
g.set(xlabel = 'Credibility Ranking\n ← Low       High  →', ylabel = 'Percent of Video Watched [%]')

enter image description here

在此处输入图片说明

However having the legend say "+ 0" and ". 1" isn't very helpful to readers. How can I edit the legend's labels? Ideally instead of saying 'millennial' it would say 'Generation' and "+ Millennial" ". Older Generations"

然而,让图例说“+ 0”和“. 1”对读者不是很有帮助。如何编辑图例的标签?理想情况下,不是说“千禧一代”,而是说“一代”和“+千禧一代”“。老一代”

采纳答案by Serenity

If legend_outis set to Truethen legend is available thought g._legendproperty and it is a part of a figure. Seaborn legend is standard matplotlib legend object. Therefore you may change legend texts like:

如果legend_out设置为,True则图例是可用的思想g._legend属性,并且它是图形的一部分。Seaborn 图例是标准的 matplotlib 图例对象。因此,您可以更改图例文本,例如:

import seaborn as sns

tips = sns.load_dataset("tips")
g = sns.lmplot(x="total_bill", y="tip", hue="smoker",
 data=tips, markers=["o", "x"], legend_out = True)

# title
new_title = 'My title'
g._legend.set_title(new_title)
# replace labels
new_labels = ['label 1', 'label 2']
for t, l in zip(g._legend.texts, new_labels): t.set_text(l)

sns.plt.show()

enter image description here

在此处输入图片说明

Another situation if legend_outis set to False. You have to define which axes has a legend (in below example this is axis number 0):

另一种情况 iflegend_out设置为False。您必须定义哪些轴具有图例(在下面的示例中,这是轴编号 0):

import seaborn as sns

tips = sns.load_dataset("tips")
g = sns.lmplot(x="total_bill", y="tip", hue="smoker",
 data=tips, markers=["o", "x"], legend_out = False)

# check axes and find which is have legend
leg = g.axes.flat[0].get_legend()
new_title = 'My title'
leg.set_title(new_title)
new_labels = ['label 1', 'label 2']
for t, l in zip(leg.texts, new_labels): t.set_text(l)
sns.plt.show()

enter image description here

在此处输入图片说明

Moreover you may combine both situations and use this code:

此外,您可以结合这两种情况并使用以下代码:

import seaborn as sns

tips = sns.load_dataset("tips")
g = sns.lmplot(x="total_bill", y="tip", hue="smoker",
 data=tips, markers=["o", "x"], legend_out = True)

# check axes and find which is have legend
for ax in g.axes.flat:
    leg = g.axes.flat[0].get_legend()
    if not leg is None: break
# or legend may be on a figure
if leg is None: leg = g._legend

# change legend texts
new_title = 'My title'
leg.set_title(new_title)
new_labels = ['label 1', 'label 2']
for t, l in zip(leg.texts, new_labels): t.set_text(l)

sns.plt.show()

This code works for any seaborn plot which is based on Gridclass.

此代码适用于任何基于Gridclass 的seaborn 图。

回答by Glen Thompson

Took me a while to read through the above. This was the answer for me:

我花了一些时间来阅读上面的内容。这是我的答案:

import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")

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

plt.legend(title='Smoker', loc='upper left', labels=['Hell Yeh', 'Nah Bruh'])
plt.show(g)

Reference this for more arguments: matplotlib.pyplot.legend

更多参数请参考:matplotlib.pyplot.legend

enter image description here

在此处输入图片说明

回答by Batuhan Tüter

If you just want to change the legend title, you can do the following:

如果只想更改图例标题,可以执行以下操作:

import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")

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

g._legend.set_title("New Title")