Seaborn violinplot 中 HUE 参数的多列

Ahm*_*nis 15 python visualization matplotlib pandas seaborn

我正在使用提示数据集,这是数据集的头部。


 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
Run Code Online (Sandbox Code Playgroud)

我的代码是


 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
Run Code Online (Sandbox Code Playgroud)

我想要一个带有 Total_bill 的一天小提琴图,其中色调是性别和吸烟者,但我找不到任何选项来设置 的多个值hue。有什么办法吗?

dlu*_*kes 23

在这种情况下,接受的答案建议的分面方法可能更好,但可能不容易适用于其他类型的 Seaborn 图(例如在我的例子中,ecdfplot)。所以我只是想分享我找到了一个解决方案,该解决方案可以满足OP最初的要求,即实际上使用多个列作为参数hue

诀窍在于,色调可以是列名称,也可以是与数据长度相同的序列,列出要分配每个数据点的颜色类别。所以...

sns.violinplot(x='day', y='total_bill', data=tips, hue='sex')
Run Code Online (Sandbox Code Playgroud)

...基本上与以下相同:

sns.violinplot(x='day', y='total_bill', data=tips, hue=tips['sex'])
Run Code Online (Sandbox Code Playgroud)

您通常不会使用后者,只是需要更多的输入来实现相同的效果 - 除非您想动态构建自定义序列:

sns.violinplot(x='day', y='total_bill', data=tips,
               hue=tips[['sex', 'smoker']].apply(tuple, axis=1))
Run Code Online (Sandbox Code Playgroud)

使用两列作为色调参数的小提琴图

构建传递的序列的方式hue完全取决于您,唯一的要求是它必须与您的数据具有相同的长度,并且如果是类似数组的,它必须是一维的,所以您不能只是通过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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Zep*_*hyr 6

您可以使用 aseaborn.catplot来使用'sex'ashue'smoker'as 列来生成两个并排的小提琴图。
检查这个代码:

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()
Run Code Online (Sandbox Code Playgroud)

这给了我这个情节:

在此输入图像描述