[英]Multiple Columns for HUE parameter in Seaborn violinplot
我正在使用提示數據集,這里是數據集的負責人。
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
我的代碼是
sns.violinplot(x='day',y='total_bill',data=tips, hue=['sex','smoker'])
我想要一個帶有 total_bill 的小提琴圖,其中色相是性和吸煙者,但我找不到任何設置多個hue
值的選項。 有什么辦法嗎?
在這種情況下,接受的答案建議的分面方法可能更好,但可能不容易適用於其他類型的 Seaborn 圖(例如,在我的情況下, ecdfplot
)。 所以我只是想分享一下,我想出了一個解決方案,它可以滿足 OP 最初的要求,即實際上使用多個列作為hue
參數。
訣竅是色調可以是列名,也可以是與數據長度相同的序列,列出要分配每個數據點的顏色類別。 所以...
sns.violinplot(x='day', y='total_bill', data=tips, hue='sex')
...基本上與以下內容相同:
sns.violinplot(x='day', y='total_bill', data=tips, hue=tips['sex'])
您通常不會使用后者,它只是為了實現相同的目的而需要更多的輸入 - 除非您想即時構建自定義序列:
sns.violinplot(x='day', y='total_bill', data=tips,
hue=tips[['sex', 'smoker']].apply(tuple, axis=1))
您構建通過hue
傳遞的序列的方式完全取決於您,唯一的要求是它必須與您的數據具有相同的長度,並且如果是類似數組的,它必須是一維的,所以您可以t 只是通過hue=tips[['sex', 'smoker']]
,您必須以某種方式將列連接成一個。 我選擇了tuple
作為最通用的方式,但是如果你想對格式有更多的控制,構建Series
字符串(為了更好的可讀性,在這里將它保存到一個單獨的變量中,但你不必這樣做):
hue = tips['sex'].astype(str) + ', ' + tips['smoker'].astype(str)
sns.violinplot(x='day', y='total_bill', data=tips, hue=hue)
您可以使用seaborn.catplot
以使用'sex'
作為hue
,使用'smoker'
作為列來生成兩個並排的小提琴圖。
檢查此代碼:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
tips = sns.load_dataset("tips")
sns.catplot(x = "day",
y = "total_bill",
hue = "sex",
col = "smoker",
data = tips,
kind = "violin",
split = True)
plt.show()
這給了我這個 plot:
'day'
/ 'sex'
或'day'
/ 'smoker'
創建一列組合字符串,將其設置為x=
,分別使用'smoker'
或'sex'
作為hue=
,並設置split=True
.python 3.10
, pandas 1.4.2
, matplotlib 3.5.1
, seaborn 0.11.2
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# load sample data
tips = sns.load_dataset("tips")
# create a new column
tips['Day - Sex'] = tips.day.astype(str) + ' - ' + tips.sex.astype(str)
# set to categorical to specify an order
categories = ['Thur - Female', 'Thur - Male', 'Fri - Female', 'Fri - Male', 'Sat - Female', 'Sat - Male', 'Sun - Female', 'Sun - Male']
tips['Day - Sex'] = pd.Categorical(tips['Day - Sex'], categories=categories, ordered=True)
# plot
fig, ax = plt.subplots(figsize=(12, 6))
sns.violinplot(x='Day - Sex', y='total_bill', data=tips, hue='smoker', ax=ax, split=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.