极坐标时钟(polar clock)是我在刚开始学习tableau的时候看到的一个作品
一下就被这个作品吸引住了,想尝试着复制一下,但是由于当时能力所限,完全不理解文章里的思路。随着学习的深入,现在再来看这个作品就觉得很简单了。
今天我来介绍一下制作方法,但这个方法是我根据原文进行了一定的改进,减少了数据集构造的难度,同时调整了一些计算字段。个人认为更简单一点。
但这篇文章跟以往的有些不同,我只介绍方法,不进行讲解,一是因为这个图形本身没有什么实际的用途,纯粹是练习技术,希望有兴趣的同学能够自己挑战,研究对比原文的方法,理解制作思路。这样才能真正有所提高。二是因为制作完成后图形是不能动的,需要调用 Tableau’s javascript API,我对前端了解甚少,没复制成功。
构造数据集
数据集很简单,表1是0-90,步长为1的等差数列,表2的Segment是用于区分时、分、秒,
引入数据集,通过link字段内连接两个表,数据集变成了270行。
创建参数
- Length(控制环的大小)
-
Taper(控制尾部的粗细)
创建计算字段
- Hour=
IF (DATEPART('hour', NOW())) >= 12
THEN (((DATEPART('hour', NOW()) + (DATEPART('minute', NOW())/60))-12)/12)*360
ELSE ((DATEPART('hour', NOW()) + (DATEPART('minute', NOW())/60))/12)*360
END
//另一种写法
//(((DATEPART('hour', NOW()) + (DATEPART('minute', NOW())/60)) % 12)/12)*360
Minute=(DATEPART('minute',NOW())/60)*360
Second=(DATEPART('second',NOW())/60)*360
X=
CASE [Segment]
WHEN 'hour' THEN .8*SIN(RADIANS([Hour]-([Index]*2*[Length])))
WHEN 'minute' THEN SIN(RADIANS([Minute]-([Index]*2*[Length])))
WHEN 'second' THEN 1.2*SIN(RADIANS([Second]-([Index]*2*[Length])))
END
- Y=
CASE [Segment]
WHEN 'hour' THEN .8*COS(RADIANS([Hour]-([Index]*2*[Length])))
WHEN 'minute' THEN COS(RADIANS([Minute]-([Index]*2*[Length])))
WHEN 'second' THEN 1.2*COS(RADIANS([Second]-([Index]*2*[Length])))
END
- Size=
([Taper]*[start point])+((1-[Taper])*(1-([Index]/90)))
- Start point=
IF [Index]=0 then 1.2
ELSE 1
END
- Label
IF
[Segment]='hour' AND [Index]=0
THEN IF DATEPART('hour', NOW()) > 12 THEN DATEPART('hour', NOW()) - 12 ELSE DATEPART('hour', NOW()) END
ELSEIF [Segment]='minute' AND [Index]=0
THEN DATEPART('minute', NOW())
ELSEIF [Segment]='second' AND [Index]=0
THEN DATEPART('second', NOW())
END
创建图形
- [X]拖到列功能区,[Y]拖到行功能区,取消聚合
- 标记类型选择线,[Segment]拖到颜色,[Index]拖到路径
- 选择下图作为背景
- 编辑背景图像的X、Y字段
- 将[Size]拖动到大小,[Label]拖动到标签,稍微美化一下,就得到了下图的效果
至于javascript API的部分,原文有代码,就请有能力的同学自己研究吧。
Public地址:https://public.tableau.com/profile/jiangbin#!/vizhome/PolarClock_15674076553860/1
此篇文章已发布到我的公众号:saodisir,有兴趣也可关注一下