如何为图形级功能编辑 seaborn 图例标题和标签

Posted

技术标签:

【中文标题】如何为图形级功能编辑 seaborn 图例标题和标签【英文标题】:How to edit a seaborn legend title and labels for figure-level functions 【发布时间】:2017-12-25 08:55:29 【问题描述】:

我使用 Seaborn 和 pandas 数据框 (data) 创建了这个图:

我的代码:

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 [%]')

您可能会注意到该图的图例标题只是变量名称 ('millennial'),而图例项是变量的值 (0, 1)。如何编辑图例的标题和标签?理想情况下,传说的标题是“一代”,标签是“千禧一代”和“老一代”

【问题讨论】:

data.assign(Generation=data.millenial.map(0: "Older Generations", 1: "Millenial")) @mwaskom(seaborn 的创建者)的评论是最简单的选择,或者重命名并映射到原始列。要移动图例,请参阅Move seaborn plot legend to a different position 【参考方案1】: 如果legend_out 设置为True,则可以通过g._legend 属性获得图例,并且它是图形的一部分。 Seaborn 图例是标准的 matplotlib 图例对象。因此,您可以更改图例文本。 python 3.8.11matplotlib 3.4.3seaborn 0.11.2中测试
import seaborn as sns

# load the tips dataset
tips = sns.load_dataset("tips")

# plot
g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, markers=["o", "x"], facet_kws='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)

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

g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, markers=["o", "x"], facet_kws='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)

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

g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, markers=["o", "x"], facet_kws='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)

此代码适用于任何基于 Grid class 的 seaborn 情节。

【讨论】:

您确定是g._legend.set_title(new_title) 而不是g.legend_.set_title(new_title) 当我使用sns.kdeplot 生成绘图时,没有_legend 属性,但生成的坐标区对象上有legend_ 属性。 不同之处在于您应该将_legend 用于任何基于 Grid 类的绘图,如原始答案中所述。 sns.kdeplot(和其他一些)将生成一个 matplotlib.axes._subplots.AxesSubplot 对象,您应该为此使用 legend_ 属性。在实践中,您可以同时尝试这两种方法并使用有效的方法。【参考方案2】:

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

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)

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

【讨论】:

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

以上是关于如何为图形级功能编辑 seaborn 图例标题和标签的主要内容,如果未能解决你的问题,请参考以下文章

如何为子图有一个共同的图例?

如何为 matplotlib 图例命名

如何在 seaborn 散点图中编辑多个图例框?

在 Seaborn histplot 子图中自定义图例

删除 Seaborn 条形图图例标题

Plotly:如何为标准偏差制作具有多条线和阴影区域的图形?