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

Cha*_* Ye 6 python matplotlib pandas seaborn violin-plot

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

\n

但是当数据是异构的\xef\xbc\x8c时,width某些组的数据太小而无法显示任何有意义的信息(图1中的Fri组)。可以选择width放大seaborn.violinplot绘图的大小。

\n

然而,一旦小规模的群体扩大到合适的规模,大群体就会变得“太大”(图2中的Sat群体)并相互重叠。

\n

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

\n
\n

演示

\n
\n

生成图 1 的代码:

\n
import seaborn as sns\n\ntips = sns.load_dataset("tips")\nax = sns.violinplot(x="day", y="total_bill", hue="sex",\n                    data=tips, palette="Set2", split=True,\n                    scale="count", inner="stick",\n                    scale_hue=False, bw=.2)\n
Run Code Online (Sandbox Code Playgroud)\n

图1

\n

图。1

\n

生成图2的代码:

\n
import seaborn as sns\n\ntips = sns.load_dataset("tips")\nax = sns.violinplot(x="day", y="total_bill", hue="sex",\n                    data=tips, palette="Set2", split=True,\n                    scale="count", inner="stick", width=2.5\n                    scale_hue=False, bw=.2) \n
Run Code Online (Sandbox Code Playgroud)\n

图2

\n

图2

\n
\n

你的解决方案是什么?

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

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

    \n
  • \n
\n
tips["day_n"] = tips["day"].map(dict(zip(tips["day"].unique(), [1, 2, 4, 6])))\n
Run Code Online (Sandbox Code Playgroud)\n

但seaborn似乎不支持数值数据,当切换x、y轴时,组之间的距离保持不变或混乱。

\n

生成图 3 的代码:

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

图3

\n

图3

\n
    \n
  • stackoverflow中有类似的问题,表明有positionsmatplotlib的选项。但这对seaborn来说也不起作用。
  • \n
\n

Ulr*_*ern 6

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

结果如下:小提琴情节