首页 > 解决方案 > Seaborn violinplot 中 HUE 参数的多列

问题描述

我正在使用提示数据集,这里是数据集的负责人。


 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。有什么办法吗?

标签: pythondataframeplotseaborndata-science

解决方案


在这种情况下,接受的答案建议的分面方法可能更好,但可能不容易适用于其他类型的 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完全取决于您,唯一的要求是它必须与您的数据具有相同的长度,并且如果是类似数组的,它必须是一维的,所以您不能只是通过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)

在此处输入图像描述


推荐阅读