直线的时间线非常简单,但是如果时间线很长,直线就不能满足要求了,曲线时间线(Curved Timeline)网上一直没找到教程,在Tableau Public上的Viz倒是很多,基本大同小异,所以只能自己慢慢拆解来寻找制作方法了,一开始一头雾水,断断续续研究了两三天才基本理清了思路。
数据准备
-
数据分为两个表,第一个year表,只有Year和link字段,标记年份(年份最好是连续数据,也可以不连续,特殊情况下影响最后效果),另一个表是point表,只有Point和link字段标记20个数据点。
Year link Point link 1900 link 0 link 1901 link 1 link 1902 link 2 link 1903 link 3 link ...... ...... ...... ...... 2015 link 16 link 2016 link 17 link 2017 link 18 link 2018 link 19 link [注意] 以上表格只是示例,应该是两张表,而且有省略。大家可以自己去建。Year随便填
Tableau引入两张表,用link字段做内连接,通过笛卡尔积每一年都生成了20行数据。
创建参数
-
Y Spacing
这个参数用来确定每行之间的间距
-
Years Per Row 每行的年数
这个参数用来确定每行有多少年
创建计算字段
计算纵轴
-
ID=[Year]*100 + [Point]
给每个数据点确定一个唯一值,假如1900年的20个点,就变成了190000-190019
-
First Year=INT({FIXED : MIN([Year])}/[Years Per Row])*[Years Per Row]
将数据集里的第一年转换成所在十年里的第1年,假如数据集的第一年是1905年,First Year就是1900年
-
Offset=INT([First Year]/[Years Per Row])
计算多少个数据点开始换行
-
Y=(INT([Year]/[Years Per Row])-[Offset])*[Y Spacing]
计算数据点在纵轴的位置,也就是在第几行
计算横轴
-
Number of Points={FIXED : MAX([Point])}
计算数据集里的最大行数
-
Row =(INT([Year]/[Years Per Row])-[Offset])+1
计算数据点在横轴的位置,也就是在第几列
-
Last Year={FIXED : MAX([Year])}
计算数据集的最后一年
X=
IF [Row]%2 = 1 THEN
IF [Year]=[Last Year] AND [Point]<>0 THEN
NULL
ELSE
([Year]%[First Year])%[Years Per Row] + [Point]/[Number of Points]
END
ELSE
IF [Year]=[Last Year] AND [Point]<>0 THEN
NULL
ELSE
[Years Per Row]-1-([Year]%[First Year])%[Years Per Row] - [Point]/[Number of Points]
END
END
给Row重新赋值
- 如果是最后一年,只会显示第1个点,后面19个点就不显示了
- 上面每个点的Row值,是从左到右排列的,现在如果是偶数行,要Row值从右到左重新计算,这样就可以按照S曲线排列了
- Curved=
IF [X]>([Years Per Row]-1) THEN
"RIGHT"
ELSEIF [X]<0 THEN
"LEFT"
ELSE
"NONE"
END
计算哪些点需要画成弧线,以每行10年为例,都是第9年的19点画半圆(第1个点不用画圆),只是奇数行是右侧半圆,偶数行是左侧半圆
计算曲线(这一部分需要参考我前面的用Tableau画圆的系列文章了解原理)
-
Angle Spacing= 180/([Number of Points]+1) 转180度
计算需要转换成曲线的点之间的角度
-
Angle=IF [Curved]<>"NONE" THEN -90+([Point]*[Angle Spacing]) END
计算每个需要转换成曲线的点的弧度
-
Center Y=[Y] + [Y Spacing]/2
计算两行正中间的值,给Y with Curve用
X with Curve=
CASE [Curved]
WHEN "RIGHT" THEN
([Years Per Row]-1)+0.5*COS(RADIANS([Angle]))
WHEN "LEFT" THEN
0-0.5*COS(RADIANS([Angle]))
ELSE
[X]
END
- Y with Curve=
IF [Curved]<>"NONE" THEN
[Center Y]+([Y Spacing]/2)*SIN(RADIANS([Angle]))
ELSE
[Y]
END
计算需要转换成曲线的点X轴坐标,Y轴坐标
Curved=RIGHT或LEFT重新计算,正常在直线上的坐标点不计算
标记关键年份
-
Event=IF [Point]=0 THEN [X] END
这个应该根据情况自己调整,这个例子是每年都标记出来
开始画图
把X with Curve拖到列功能区,Y with Curve拖到行功能区,标记类型选择“线”,把ID拖到“路径”上,然后把Event拖到列功能区,标记类型选择“圆”,右键双轴,同步轴,把Event再拖到“工具提示”里。其他美化部分就不说了。
效果图如下:
最上面的那个Viz效果,大家可以自行下载源文件研究
年份最好是连续数据,也可以不连续,特殊情况下影响最后效果,关于这个问题,简单说一下,如果以10年为一行,那么如果数据缺失了第9年,那么相应的行圆弧就会缺右半边,如果缺失了第0年,相应的行圆弧就会缺左半边。大家可以自己试一下。
此篇文章已发布到我的公众号:saodisir,有兴趣也可关注一下