如何为每个 class 和组生成单独的小提琴图

How to generate separate violinplots for each class and group

我有一个 pandas 数据框:

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
df['Label'] = np.random.randint(0,2,size=100)

我想在 python 中创建一个图形,其中 x 轴显示 class 标签('Class 0' 和 'Class 1')并且每个 class 并为像 'B' 这样的预定义变量创建了小提琴图(里面有一个箱线图)。

使用seaborn,非常简单:

import seaborn as sns
...
sns.violinplot(x=df.Label, y=df.B)

导入和 DataFrame

import pandas as pd
import seaborn as sns

# sample data
df = pd.DataFrame(np.random.randint(0, 100, size=(100, 4)), columns=list('ABCD'))
df['Class'] = np.random.randint(0, 2, size=100)

# melt the dataframe to a long form
dfm = df.melt(id_vars='Class', var_name='Group')

# display(dfm.head())
   Class Group  value
0      1     A     12
1      1     A     43
2      0     A     58
3      1     A     49
4      1     A     47

绘图

seaborn.violinplot

p = sns.violinplot(data=dfm, x='Group', y='value', hue='Class')
p.legend(title='Class', bbox_to_anchor=(1, 1), loc='upper left')
  • x='Group', hue='Class'

  • x='Class', hue='Group'

seaborn.catplot

  • 要轻松地为每个组单独绘制,请使用 seaborn.catplotkind='violin'
sns.catplot(kind='violin', data=dfm, x='Class', y='value', col='Group', col_wrap=2)