Python 如何更改seaborn violinplot图例标签?
我用seaborn制作了一个小提琴图,它用颜色来识别谁幸存了,谁没有。这是由“死亡事件”一栏给出的,其中0表示该人幸存,1表示他们没有。我唯一的问题是我不知道如何为这个色调图例设置标签。如下图所示,“死亡事件”表示0和1,但我想将其改为“幸存”和“未幸存” 当前代码:Python 如何更改seaborn violinplot图例标签?,python,matplotlib,seaborn,data-science,Python,Matplotlib,Seaborn,Data Science,我用seaborn制作了一个小提琴图,它用颜色来识别谁幸存了,谁没有。这是由“死亡事件”一栏给出的,其中0表示该人幸存,1表示他们没有。我唯一的问题是我不知道如何为这个色调图例设置标签。如下图所示,“死亡事件”表示0和1,但我想将其改为“幸存”和“未幸存” 当前代码: import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import matplotlib as
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(标签=['Survived','notsurvived'])
,但由于某种原因,它返回的是一条不带颜色的细线和粗线
我知道我可以用:
data['DEATH_EVENT'].replace({0:'Survived', 1:'Not survived'}, inplace=True)
但我想看看是否还有别的办法。我还是个新手,所以我猜CSV的作者之所以使用整数来描述很多事情,是有原因的。例:如果有人吸烟或不吸烟,性,糖尿病或不吸烟,等等。也许它运行得更快?控制Seaborn legends仍然有些棘手(matplotlib的API的一些扩展可能会有帮助)。在这种情况下,您可以从刚刚创建的图例中获取控制柄,并将其重新用于新图例:
将numpy导入为np
作为pd进口熊猫
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
data=pd.DataFrame({“冒烟”:np.random.randint(0,2200),
“幸存”:np.random.randint(0,2200),
“年龄”:np.随机.正常(60,10200),
“死亡事件”:np.random.randint(0,2200)})
ax=sns.violinplot(data=data,x='smoking',y='age',hue='DEATH\u EVENT')
ax.set_xticklabel([“禁止吸烟”,“吸烟])
legend(handles=ax.legend..legendHandles,标签=['surved','notsurved'])
下面是一种通过数据帧进行更改而不更改原始数据帧的方法。为了避免同时访问ax.legend_uuu
(删除图例标题),一个技巧是将列重命名为空白字符串(并将该空白字符串用于色调
)。如果数据帧不是超长的(即没有数百万行),则速度和内存开销相当适中
names={0:'幸存',1:'未幸存'}
ax=sns.violinplot(data=data.replace({'DEATH\u EVENT':names}).rename(columns={'DEATH\u EVENT':''}),
x=‘吸烟’,y=‘年龄’,色调=“”)
创建matplotlib图形后,几乎可以随时更改它的任何内容。有些事情很简单,很明显,有些事情很棘手。更改图例文本是可能的,但有点棘手。正确的答案是给seaborn你想要使用的标签。(无需修改原始数据帧,只需对传递给seaborn的对象调用replace
。@mwaskom是否有办法删除图例标题,而无需引入空名称的列(也无需访问ax.legend\uu
,如ax.legend\uu.set\u title(“”)
)?与创建一个临时的新对象,然后在绘图完成后回收垃圾相比,在原地执行pandas操作几乎从来不会真正带来内存优势:好的,我明白了。Pandas正在进行大量的内部优化,如果不深入研究其源代码,这些优化很难猜测,而且将来可能会发生变化。我删除了我帖子的最后一部分。