如何更改 seaborn violinplot 图例标签?

How to change seaborn violinplot legend labels?

我正在使用 seaborn 制作 violinplot,它使用色调来确定谁幸免于难。这是由 'DEATH_EVENT' 列给出的,其中 0 表示该人幸存,1 表示他们没有。我遇到的唯一问题是我不知道如何为这个色调图例设置标签。如下所示,'DEATH_EVENT' 表示 0 和 1,但我想将其更改为 'Survived' 和 'Not survived'。

当前代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
sns.set()
plt.style.use('seaborn')
data = pd.read_csv('heart_failure_clinical_records_dataset.csv')

g = sns.violinplot(data=data, x='smoking', y='age', hue='DEATH_EVENT')
g.set_xticklabels(['No smoking', 'Smoking'])

我尝试使用:g.legend(labels=['Survived', 'Not survived']),但它 returns 它没有颜色,出于某种原因取而代之的是细线和粗线。

我知道我可以使用:

data['DEATH_EVENT'].replace({0:'Survived', 1:'Not survived'}, inplace=True)

但我想看看有没有别的办法。我还是菜鸟,所以我猜 CSV 的作者使用整数来描述很多东西是有原因的。例如:如果有人抽烟或不抽烟,是否有性行为,是否患有糖尿病等。也许它运行得更快?

控制 Seaborn 图例仍然有些棘手(对 matplotlib API 的一些扩展会有所帮助)。在这种情况下,您可以从 just-created 图例中获取句柄并将它们重新用于新图例:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame({"smoking": np.random.randint(0, 2, 200),
                     "survived": np.random.randint(0, 2, 200),
                     "age": np.random.normal(60, 10, 200),
                     "DEATH_EVENT": np.random.randint(0, 2, 200)})
ax = sns.violinplot(data=data, x='smoking', y='age', hue='DEATH_EVENT')
ax.set_xticklabels(['No smoking', 'Smoking'])
ax.legend(handles=ax.legend_.legendHandles, labels=['Survived', 'Not survived'])

这是一种通过数据帧进行更改而不更改原始数据帧的方法。为避免一起访问 ax.legend_(删除图例标题),一个技巧是将列重命名为空白字符串(并将该空白字符串用于 hue)。如果数据帧不是超长(即没有数百万行),则速度和内存开销非常适中。

names = {0: 'Survived', 1: 'Not survived'}
ax = sns.violinplot(data=data.replace({'DEATH_EVENT': names}).rename(columns={'DEATH_EVENT': ''}),
                    x='smoking', y='age', hue='')