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

8wtpewkr  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(168)

小提琴图的形状对于可视化分组数据的数据分布非常有用。每个组的大小也可以被可视化为“小提琴”的面积。
但是当数据是异质的时,某个组的width太小而不能显示任何有意义的信息(图1中的Fri组)。seaborn.violinplot中有width选项用于放大图的大小。
然而,一旦小规模的组被扩大到合适的规模,大的组将变得“太大”(图2中的Sat组)并且彼此重叠。
因此,我的问题是如何分配不同的间距小提琴情节在海上。
演示

图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轴上的类别数据Map为数值形式,它们之间的距离不同。
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

  • 类似于stackoverflow中的question,说明matplotlib中有positions选项,但seaborn中也没有。
sg3maiej

sg3maiej1#

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

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()

结果如下:

相关问题