跳至正文

用Tableau画曲线时间线

直线的时间线非常简单,但是如果时间线很长,直线就不能满足要求了,曲线时间线(Curved Timeline)网上一直没找到教程,在Tableau Public上的Viz倒是很多,基本大同小异,所以只能自己慢慢拆解来寻找制作方法了,一开始一头雾水,断断续续研究了两三天才基本理清了思路。
https://public.tableau.com/profile/ken.flerlage#!/vizhome/CurvedTimeline/Dashboard

数据准备

数据分为两个表,第一个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
Y Spacing

这个参数用来确定每行之间的间距

  • Years Per Row 每行的年数
image.png

这个参数用来确定每行有多少年

创建计算字段

计算纵轴
  • 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. 如果是最后一年,只会显示第1个点,后面19个点就不显示了
2. 上面每个点的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年,相应的行圆弧就会缺左半边。大家可以自己试一下。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注