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

时间:2018-10-09 12:01:48

标签: python pandas matplotlib data-visualization seaborn

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

但是,当数据异构时,某些组的width太小而无法显示任何含义信息(图1中的Fri组)。 seaborn小提琴图中有width个选项,可以放大图的大小。

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

因此,我的问题是如何为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

fig1

用于生成图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

fig2

  

您的解决方案是什么?

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

  • 我试图将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

fig3

  • stackoverflow中类似的question,表示matplotlib有positions选项。但这对seaborn也不起作用。

1 个答案:

答案 0 :(得分:1)

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

结果如下:violinplot