用Tableau画小提琴图
小提琴图 (Violin Plot)是用来展示多组数据的分布状态以及概率密度。这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。跟箱形图类似,但是在密度层面展示更好。在数据量非常大不方便一个一个展示的时候小提琴图特别适用。
箱线图是Tableau中自带的图形,但要实现小提琴图就有点难度了。Gwilym提供了一种方法,通过绘制多边形来实现。大家可以看一下他的文章,里面有详细的思路和实现步骤(包括试错的过程),讲述的非常详细。
博客地址:
http://w2h.cc/ODAxO
Public地址:https://public.tableau.com/profile/gwilym#!/vizhome/HowtocreateviolinplotsinTableau/0_plotsamples
下面我就根据Gwilym的方法,教大家自制一个小提琴图。原理都略过,只取干货。
创建数据集
Sample ID,Sample Value,Group
1,6.2,male
2,5.1,male
3,1.9,male
4,-0.4,male
5,-1.3,male
6,-2.1,male
1,5.2,female
2,4.1,female
3,0.9,female
4,-1.4,female
5,-2.3,female
6,-3.1,female
数据集沿用Gwilym文章里的,为了增加一点点难度,我增加了一列Group。
x
0
1
2
……
97
98
99
辅助表就是一个0-99,步长为1的等差数列。
内联接两张数据表。
创建计算字段
- 创建参数X scaling factor,浮点值,默认值5。
- 创建参数bandwidth,浮点值,默认值2.25。
这里要说一下,以上这两个参数,要根据数据集的不同自行调整,如果数据值很大,那么上面的值相应变大,需要多尝试。曲线的平滑度是用bandwidth来控制。
- X-axis
IF [x] = 0 THEN {MIN([Sample Value])} - [X scaling factor]
ELSEIF [x] = 1 THEN {MIN([Sample Value])} - [X scaling factor]
ELSEIF [x] = 99 THEN {MAX([Sample Value])} + [X scaling factor]
ELSE
({MIN([Sample Value])} - [X scaling factor]) +
(
ABS(
({MAX([Sample Value])}+[X scaling factor]) - ({MIN([Sample Value])}-[X scaling factor])
)
* (([x]-1)/97)
)
END
- Y1
IF [Group]="male" then
(IF [x] = 0 THEN 0
ELSEIF [x] = 99 THEN 0
ELSE
1/({COUNTD([Sample ID])}*[bandwidth])
*
(1/(SQRT(2*PI()))) * EXP(-0.5 * (
([X] - [Sample Value])^2)/[bandwidth])
END)
END
- Y2
IF [Group]="female" then
(IF [x] = 0 THEN 0
ELSEIF [x] = 99 THEN 0
ELSE
1/({COUNTD([Sample ID])}*[bandwidth])
*
(1/(SQRT(2*PI()))) * EXP(-0.5 * (
([X] - [Sample Value])^2)/[bandwidth])
END)
END
这里为了区别男女,多加了一个Y2,如果没有分组的需要,只用一个Y1,并去掉IF [Group]这个判断就可以了。
创建视图
-
将[X-axis]拖到行功能区。
-
将[Y2]拖到列功能区,增加负号,变成-SUM([Y1])。
-
将[Y1]拖到[Y2]的右侧。
-
标记类型选择“多边形”,[x]拖到路径上。
-
调整一下[Y1]和[Y2]的颜色,区分出男女。
上面介绍的是Gwilym的方法,另外我尝试了一下不用辅助表,只用原始数据,制作并集,并创建数据桶的方式来制作,但是这样做增加了一些额外的表计算步骤,难度加大了一些,就不给大家介绍了。
如果有兴趣,可以下载我按照数据桶方式做好的Viz,自行研究学习。
https://public.tableau.com/profile/jiangbin#!/vizhome/violin_15913432542690/1
此篇文章已发布到我的公众号:saodisir,有兴趣也可关注一下