用Tableau画曲线时间线

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

https://public.tableau.com/profile/ken.flerlage#!/vizhome/CurvedTimeline/Dashboard

数据准备

  1. 数据分为两个表,第一个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随便填

  2. 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个点就不显示了
  1. 上面每个点的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,有兴趣也可关注一下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354