如何更改seaborn violinplot图例标签?

时间:2021-03-28 21:15:10

标签: python matplotlib seaborn data-science

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

Current plot image.

当前代码:

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']),但由于某种原因它返回没有颜色,而是一条细线和粗线。

 (image).

我知道我可以使用:

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

但我想看看是否有其他方法。我仍然是一个菜鸟,所以我猜想 CSV 的作者这样做是有原因的,因此它使用整数来描述很多事情。例如:如果有人吸烟与否,性别,是否患有糖尿病等。也许它跑得更快?

1 个答案:

答案 0 :(得分:2)

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

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

violinplot with changed legend

这是一种通过数据框进行更改而不更改原始数据框的方法。为了避免同时访问 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='')
相关问题