如何更改seaborn小提琴图的图例标签?

3
我正在使用seaborn制作小提琴图,其中使用色调来识别谁幸存了,谁没有。这是由列“DEATH_EVENT”给出的,其中0表示这个人幸存,1表示他们没有幸存。唯一的问题是我无法弄清楚如何设置此色调图例的标签。如下所示,“DEATH_EVENT”呈现为0和1,但我想将其更改为“幸存”和“未幸存”。
当前代码:
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=['幸存', '未幸存']),但它返回的没有颜色,而是出现了一些薄线和粗线。

(图片)

我知道我可以使用以下方法:

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

但我希望看看是否有其他方法。我仍然是新手,所以猜想CSV的作者使用整数来描述许多东西肯定有原因。例如:吸烟或否、性别、糖尿病或否等。也许这样可以运行得更快?


几乎总是可以在创建matplotlib图形后更改其任何内容。有些事情很容易和明显,而其他事情则比较棘手。更改图例文本是可能的,但有点棘手。这里的正确答案是给seaborn提供要使用的标签。(不需要就地修改原始数据帧,只需在传递给seaborn的对象上调用“replace”即可。) - mwaskom
@mwaskom 有没有一种方法可以在不使用空名称列的技巧(也不需要访问ax.legend_,如ax.legend_.set_title(''))的情况下删除图例标题? - JohanC
1个回答

3

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

修改了图例的小提琴图

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

在Pandas操作中使用“inplace”几乎从来没有实际的内存优势,相对于创建一个临时新对象,然后在绘制完成后进行垃圾回收:https://github.com/pandas-dev/pandas/issues/16529 - mwaskom
好的,我明白了。Pandas做了很多内部优化,这些在没有深入研究源代码的情况下很难猜测,并且未来可能会发生变化。我已经删除了我贴子的最后一部分。 - JohanC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接