如何在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使用violinplot函数可视化分组小提琴图(violin plot)使用inner函数设置在小提琴图中使用虚线显示分位数位置(inner = ‘quartile‘)