簡體   English   中英

Seaborn violinplot 中 HUE 參數的多列

[英]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:

在此處輸入圖像描述

  • 一個選項,它創建一個新列,類似於dlukes的答案。
  • 'day' / 'sex''day' / 'smoker'創建一列組合字符串,將其設置為x= ,分別使用'smoker''sex'作為hue= ,並設置split=True .
  • Tested in 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM