[英]How to change seaborn violinplot legend labels?
我正在使用 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=['Survived', 'Not survived'])
,但由於某種原因,它在沒有 colors 的情況下返回它,而是一條細而粗的線。
我知道我可以使用:
data['DEATH_EVENT'].replace({0:'Survived', 1:'Not survived'}, inplace=True)
但我想看看是否有其他方法。 我還是個菜鳥,所以我猜測 CSV 的作者之所以這樣做是有原因的,所以它使用整數來描述很多東西。 例如:如果有人吸煙與否,性生活,糖尿病與否等。也許它跑得更快?
控制 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 進行更改而不更改原始 dataframe 的方法。 為了避免一起訪問ax.legend_
(以刪除圖例標題),一個技巧是將列重命名為空白字符串(並將該空白字符串用於hue
)。 如果 dataframe 不是超長(即沒有數百萬行),則速度和 memory 開銷相當適中。
names = {0: 'Survived', 1: 'Not survived'}
ax = sns.violinplot(data=data.replace({'DEATH_EVENT': names}).rename(columns={'DEATH_EVENT': ''}),
x='smoking', y='age', hue='')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.