编辑seaborn传奇

Oli*_*r G 35 python matplotlib legend seaborn

在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 [%]')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是有传说说"+ 0"和".1"对读者来说并不是很有帮助.如何编辑图例的标签?理想情况下,它不是说"千禧一代",而是说"一代"和"+千禧一代"."老一代"

Ser*_*ity 38

如果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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果legend_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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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()
Run Code Online (Sandbox Code Playgroud)

此代码适用于基于Grid类的任何seaborn图.

  • 您确定它是“g._legend.set_title(new_title)”而不是“g.legend_.set_title(new_title)”吗? (10认同)
  • 不同之处在于,您应该对基于 Grid 类的任何绘图使用“_legend”,如原始答案中所述。`sns.kdeplot` (和其他一些)将生成一个 `matplotlib.axes._subplots.AxesSubplot` 对象,您应该使用 `legend_` 属性。在实践中,您可以同时尝试两种方法并使用有效的一种。 (4认同)
  • 要更改图例标题,我必须使用`.legend_.set_title()` (3认同)
  • 当我使用“sns.kdeplot”生成绘图时,没有“_legend”属性,但生成的坐标区对象上有一个“legend_”属性。 (3认同)
  • @Serenity我刚试过``ax`对象的`dir()`而且没有`_legend`属性,但是有一个`legend_`属性.我不得不将`zip(g._legend.texts,new_labels)`更改为`zip(g.legend_.texts,new_labels)`以使代码生效.也许这是由于最近修改了`matplotlib`? (2认同)

Gle*_*son 27

花了我一段时间阅读以上内容。这是我的答案:

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)
Run Code Online (Sandbox Code Playgroud)

请参考此以获取更多参数:matplotlib.pyplot.legend

在此处输入图片说明

  • 此选项不会编辑现有的图例,它会为图形级别的最后一个轴(没有“ax”参数的图)创建一个新的图例。对于大多数图形级绘图来说,这不是一个好的解决方案,因为它不太可能匹配所有轴的所有标记/颜色。对于单个轴级图(带有“ax”参数的图)来说应该没问题 (19认同)
  • 请注意,当您交换图例标签“labels=['Hell Yeh', 'Nah Bruh']”时,“Hell Yeh”数据点将变为“Nah Bruh”数据点。 (8认同)
  • 图例中的符号与标记不匹配。 (5认同)