一直想研究南丁格尔玫瑰图,但是好长一段时间都不得法门,写完用Tableau画环形图系列后,虽然能画出来但是不知道原理,这两天再来研究玫瑰图,就发现霍然开朗,学习嘛,应该张弛有度,放下一段时间可能就顿悟了。
现在列出参考的几篇文章
1.https://downforthecountblog.com/2018/11/12/how-to-coxcomb-charts-in-tableau/(这篇文章是从prep处理数据,到Tableau画图,全部用动画形式,很直观)
2.https://www.thedataschool.co.uk/gwilym-lockwood/coxcomb-charts-alteryx-tableau-one-stop-blog-shop/(这篇文章讲了画玫瑰图的数学原理)
3.https://www.jianshu.com/p/b17747c8145b(阿达这篇文章着重方法,原理很少)
首先应该说一下,与画圆环图不同,玫瑰图的画法是利用多边形功能,画扇形,但是基本原理还是三角函数,建议先学会以前的画圆系列再看这篇原理的文章,会更加明白。
玫瑰图一般就是两种,只有一级科目或者含有二级科目。方法都一样,我们采用最简单的只有一级科目的数据。为了是数据更好理解,我们只画3个扇形。
那么现在构造数据,改造数据只需要三个字段,类别,数值和path。类别也可是时间,但一般都为维度,数值随便填,path是为了构造数据桶(阿达的文章里用的是1-102,为了能画的不那么圆,大家看的更直观我选1-13)
Tableau引入数据,path转换成维度,创建数据桶
创建计算弧度的两个字段
【Edges】=INDEX()
【Angle】=([Edges]-1)*(2*PI()/WINDOW_MAX([Edges]))
创建计算扇形个数的两个字段
【Count】=INDEX()
【Number of Slices】=WINDOW_MAX([Count])
创建计算半径的字段
【Radius】=SQRT(AVG([数值])/PI())
创建X、Y相关字段
【Index】=INDEX()
【X】=IIF([Index]=1 OR[Index]=WINDOW_MAX([Index]),0,WINDOW_MAX([Radius])
*COS([Angle]+((([Index]-2)*WINDOW_MAX(2*PI())/([Number of Slices]*10)))))
【Y】=IIF([Index]=1 OR[Index]=WINDOW_MAX([Index]),0,WINDOW_MAX([Radius])
*SIN([Angle]+((([Index]-2)*WINDOW_MAX(2*PI())/([Number of Slices]*10)))))
好了,一共是4组,8个计算字段
开始创建玫瑰图
首先把【X】、【Y】拖到行列功能区(谁放行、列都可以),然后将【类别】拖入标签的颜色和详细信息,选择多边形标记,【path数据桶】拖入路径。
最麻烦的是编辑表计算,例如X字段一共是6个表计算,上面两个【X】和【Index】计算依据选【path数据桶】,后面四个【Edges】、【Angle】、【Count】、【Number of Slices】表计算依据都选【类别】。Y字段是一样的。
这样我们就得到了基本的玫瑰图,大家注意到了,不是很圆,这就是【path】设置少的效果
下面就来讲一下原理吧。
首先画扇形的基础是画圆,画圆的基础就是三角函数,这个大家可以参考《用Tableau画环形图系列(一)画个简单的圆》里面X坐标=a + sin(2*PI / 360*角度) * r ;Y坐标=b + cos(2*PI / 360*角度) * r,这里都是同心圆,所以X= sin(2*PI / 360*角度) * r ,Y= cos(2*PI / 360*角度) * r
先说这里的r,也就是【Radius】=SQRT(AVG([数值])/PI()),圆的面积就是S=πr²,要求r就用下面的推导公式,也就是说我们用数值的大小来反求出来半径的长度,数值大的,半径就大,数值小的半径小,例子里面就是扇形2的数值最大,扇形1的数值最小。
我们摘出来【X】的一部分(【Y】同理)
WINDOW_MAX([Radius])*COS([Angle]+((([Index]-2)*WINDOW_MAX(2*PI())/([Number of Slices]*10))))
其中WINDOW_MAX([Radius])就是半径
其中cos([Angle])这部分是确定了扇形的起始角度,【Edges】=INDEX()按照【类别】计算值是1-3,扇形1=1,扇形2=2,扇形3=3,【Angle】=([Edges]-1)*(2*PI()/WINDOW_MAX([Edges]))就是2*PI / 360*角度的变形,只有([Edges]-1)/WINDOW_MAX([Edges])决定了扇形的起始角度,比如扇形1起始是0度,扇形2起始是120度,扇形3起始是240度
有了起始点的位置,剩下就是每个点的位置了,这个是由这段表计算决定的((([Index]-2)*WINDOW_MAX(2*PI())/([Number of Slices]*10))),和上面的一样其实([Index]-2)/([Number of Slices]*10这段决定了每个点相对起始点的位置,就例子的图形来说,每个扇形都被等分成了10份,每份之间是12度,画点2时相对起始点增加了0度,画点3的时候相对起始点,增加了12度,以此类推。(如果path是1-102,就乘以99,都是path的最大值减3,第三篇阿达的参考文章里就是99)
而【IIF([Index]=1 OR[Index]=WINDOW_MAX([Index]),0】就是说,点1和点13时,都划到圆心,这就形成了一个封闭的扇形。其他两个扇形也是一样的。
基本上原理就讲解完了。
含有二级科目的图放到下一篇
此篇文章已发布到我的公众号:saodisir,有兴趣也可关注一下