我用海运制作了一个小提琴图,用颜色来识别谁幸存了,谁没有。这是由列“死亡事件”(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=['Survived', 'Not survived']),但它返回它时没有颜色,而是由于某种原因而变成了一条又细又粗的线条。

我知道我可以用:
data['DEATH_EVENT'].replace({0:'Survived', 1:'Not survived'}, inplace=True)但我想看看有没有别的办法。我仍然是个新手,所以我猜想CSV的作者之所以这么做是有原因的,因为它用整数来描述很多事情。例句:如果有人抽烟或不抽烟,做爱,糖尿病,等等,也许它跑得更快?
发布于 2021-03-28 22:00:49
控制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'])

下面是一种通过dataframe进行更改而不更改原始数据的方法。为了避免一起访问ax.legend_ (为了删除图例标题),一个诀窍是将列重命名为空字符串(并将该空字符串用于hue)。如果dataframe不是超长(即没有数百万行),则速度和内存开销相当小。
names = {0: 'Survived', 1: 'Not survived'}
ax = sns.violinplot(data=data.replace({'DEATH_EVENT': names}).rename(columns={'DEATH_EVENT': ''}),
x='smoking', y='age', hue='')https://stackoverflow.com/questions/66846287
复制相似问题