Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更改seaborn violinplot图例标签?_Python_Matplotlib_Seaborn_Data Science - Fatal编程技术网

Python 如何更改seaborn violinplot图例标签?

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

我用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 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正在进行大量的内部优化,如果不深入研究其源代码,这些优化很难猜测,而且将来可能会发生变化。我删除了我帖子的最后一部分。