如何在seaborn小提琴图中为每个组分配不同的位置

Posted

技术标签:

【中文标题】如何在seaborn小提琴图中为每个组分配不同的位置【英文标题】:How to assign different position for each group in seaborn violin plot 【发布时间】:2019-03-14 04:59:09 【问题描述】:

小提琴图的形状对于可视化分组数据的数据分布很有用。每组的大小也可以可视化为“小提琴”的面积。

但是当数据异构时,某个组的width太小而无法显示任何意义信息(图1中的Fri组)。 seaborn violinplot 中有width 选项用于扩大情节的大小。

但是,一旦将小尺寸的组放大到合适的比例,大的就会变得“太大”(图2中的Sat组)并相互重叠。

因此,我的问题是如何为 seaborn 中的小提琴图分配不同的间隙距离。

演示

生成图 1 的代码:

import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick",
                    scale_hue=False, bw=.2)

图1

生成图2的代码:

import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick", width=2.5
                    scale_hue=False, bw=.2) 

图2

你的解决方案是什么?

第一次尝试是增加图形宽度,但它看起来很糟糕,并且在图形中留下了太多的空白。

我尝试将 x 轴上的类别数据映射为数字形式,它们之间的距离不同。

tips["day_n"] = tips["day"].map(dict(zip(tips["day"].unique(), [1, 2, 4, 6])))

但是seaborn好像不支持数值数据,切换x、y轴时组间的距离保持不变或乱七八糟。

生成图 3 的代码:

ax = sns.violinplot(y="day_n", x="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick", width=2.5,
                    scale_hue=False, bw=.2)

图3

***中类似question,表示matplotlib有positions选项。但它也不适用于 seaborn。

【问题讨论】:

另一种方法是更改​​您的scale 参数。将其设置为 'area''width' 可能是适合您的解决方案。 @busybear 它会起作用,但这意味着删除组大小信息。这是为了避免问题而不是解决问题 【参考方案1】:

使用order参数可以实现[1, 2, 4, 6]在x轴上的位置:

import seaborn as sns, matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick",
                    scale_hue=False, bw=.2, width=2.5,
                    order=('Thur', 'Fri', '', 'Sat', '', 'Sun'))

# get rid of ticks for empty columns (levels)
ax.set_xticks([0,1,3,5])
ax.set_xticklabels(['Thur', 'Fri', 'Sat', 'Sun'])

plt.show()

结果如下:

【讨论】:

已经足够好了。添加set_xticks会更好。谢谢斯特恩。 从数据可视化的角度来看,为了保持一致性,我可能还会在周四和周五之间添加刻度。特别是因为它在时域中并且在 x 轴上,它可能会触发查看者认为缺少某些数据或者这意味着 thur 和 fri 更接近。 @ChangYe,我对您的编辑做了一些小修正并更新了情节,没有空列的 xticks 更漂亮。

以上是关于如何在seaborn小提琴图中为每个组分配不同的位置的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn小提琴图中HUE参数的多列

Seaborn使用violinplot函数可视化分组小提琴图(violin plot)使用inner函数设置在小提琴图中使用虚线显示分位数位置(inner = ‘quartile‘)

seaborn plot 小提琴的阵列

在 seaborn 中绘制不同的组时如何将数据作为一组包含在内

如何在不同的 seaborn 图中匹配调色板?

使用seaborn分割不同范围的小提琴图