Tableau实现世界GDP排名动态图

用Tablueau实现世界GDP动态排名是一个很繁琐的过程。由于我自己本身对Tableau的了解不是特别深,所以这次会将实现过程详细记录下来,篇幅会有点长。

数据集下载地址:

链接:https://pan.baidu.com/s/1U9hN2S6BedXa9PHUMeo7LA 
提取码:0zgw

1) 数据源连接

上述下载的new_main_country.xlsx中共有三张表【gdp】、【帧数】和【point】。先来看【gdp】表,这一张表中所有Year=2018的数据用了红色显示。

这一部分数据是我自己为了后续计算额外增加的一部分数据,原始的数据中只包括21个国家从2000年到2017年的GDP数据,而这部分2018年数据是直接拷贝Year=2017年的数据,并将拷贝来的这一部分数据的Year更改为2018。后续遇到这个问题时会详细说明。【gdp】表中还有连接字段Label,这个字段主要用来与【帧数】表和【point】关联。

【帧数】表的作用如下(【point】表的作用后续用到时再说明):

  • 【帧数】表实现GDP动态变化。举个例子,从200年2001年GDP排名变化,可以一步到位,这个时候就不需要【帧数】这张表。如果我们希望分5步甚至10步来完成的话,这个时候就需要【帧数】表了。我们这里分5步实现相邻年份之间的变动,所以【帧数】表里,anim的取值为0,1,2,3,4。

具体的三张表的连接方式如下:

在工作表中,将【Year】和【point】转换为【维度】。

2) 主要计算字段

首先需要创建几类计算字段。

第一类:分页类。这一类计算字段主要用于分页。每一页显示一步跳跃状态。具体如下:

这里需要说明两点: 

  • 【frame】用于分页,后续会将其拖入到【页面】框中。虽然从现在来看,【anim_inter】字段有点鸡肋,但是后续会发挥很大用处,这里不能省略。
  • 【frame】在计算时需要先将【Year】的数据类型改为数值型,否则会报错。
  • 最后要将这两个计算字段转换为【维度】。这个时候可以将【frame】放入【列】中,可以看到【frame】的取值情况(可以验证一下结果与你想要的是否一致)。

第二类:GDP数据类。正如前面所说,我们将相邻年份之间的GDP变化分5步完成,所以我们需要分别计算这5步所对应的具体的GDP值。具体需要用到的计算字段如下:

其中,【value_current】计算当前国家当前年份的GDP值,这里用了固定级别表达式,可以保证计算出的【value_current】值不随其他字段波动。【value_next】主要用来计算当前国家下一年份的GDP值,这个功能的实现需要设置好维度,后续会详细说明。【value_inter】对应的值就是每一步跳跃时对应的GDP值,这里将相邻年份的GDP差值平均分配到每一次跳跃上。

第三类:rank类。这一类计算与上一类计算字段相似,只不过上一类计算是GDP数值,这一类计算的是每一步跳跃时对应的排名。

第四类:坐标轴类。 具体如下:

这里单独设置两个坐标轴计算字段原因如下:因为在跳跃的时候,必然会出现两个国家数据重叠的现象(比如一个国家GDP排名下降,另一个国家GDP排名上升到他的位置上).。如果用【rank_inter】放入【列】中,并将其设置为【离散】属性的时候,无法直观的表示这种重叠的现象。也是因为需要自己设置坐标轴参数,所以引入【point】表。对于每一个国家每一次跳跃时GDP值,先用4个point框定出4个角的位置,然后再用多边形实现视觉上的水平柱状图。

3) 搭建动态图基本框架

  • 首先,先将对应字段拖人到相关位置中(注意要将【标记】框中图形显示方式改为【圆】)。然后对【value_inter】【@x_inter】和【@y_inter】设置表计算依据。

对于【value_inter】和【@x_inter】的表计算依据相同(因为【@x_inter】中用到了【value_inter】)。以【value_inter】为例,其计算依据如下:

对【@y_inter】涉及到嵌套计算,分别需要设置【rank_current】和【rank_next】分别设置计算依据,其具体如下:

之后就可以看到图表区发生了如下变化。

这里我们需要对表计算中特定维度的选择做个说明。其实这里特定维度主要是对【value_next】的计算产生影响。只要【value_next】计算正确了,【value_inter】也就计算正确了。下面主要对验证过程做一个说明。

从分析->查看数据中将【完整数据】和【摘要】部分都导出。然后将两个导出数据保留有用字段,并合并成一张表,方便查看。最终形成的Excel表结构如下:

然后我们来手动实现以下【value_next】的计算过程。【value_next】的计算过程如下:先按【anim_inter】、【Country】、【point】对数据进行分组,在每个组对,先按【frame】,再按【Year】对数据进行排序,然后取距离当前行偏移1个位置的目标行的【value_current】值即为当前行的【value_next】值。以【anim_inter】=0、【Country】=Argentina、【point】=1分组为例,其具体计算过程如下(可以先将【value_inter】隐藏):

图中箭头指示了【value_next】的填充位置。这里还有一个问题,【frame】和【Year】共同作为排序依据,能否去掉一个?这里不能去掉。假如这里特定维度中只有【frame】字段,那么【Year】会自动添加到分组依据中,此时,每个组就只剩下一条数据了(如下图),此时【value_next】值会永远为空。同理,在特定维度中删除【Year】也是如此。

现在我们来验证一下【value_inter】的计算是否正确。以【Country】=Argentina,point=1(同一条件下不同point对应的【vluae_current】和【value_inter】是相同的)为例,观察【value_inter】的值变化,或者直接用后一行的【value_inter】减去前一行的【value_inter】。经过验证【value_inter】实现了我们想要的结果。

另外,从这个excel表中还可以看到一个问题,当Year=2018时,对应的【value_inter】为空,这个从刚才的【value_next】的计算过程可以看出原因,Year=2018的数据排在每一个组的最后一行,其对应的【value_next】为空。这也是我为什么在数据中把Year=2017的GDP数据扩展到Year=2018中。如果不进行扩展,将无法展示出从frame>=2017.0GDP值。(目前用的这种方法比较容易实现,计算字段的代码也容易实现)

再来看【@y_inter】的设置。这个计算字段关联到两个字段的设置。【rank_next】和前面的【value_next】所有实现的功能基本一致,所以这个字段的设置与【value_inter】一样。下面我们看看【rank_current】,这个字段只需要选定【Country】即可(如下图)。

仍然以刚才的Excel文件来展示,其中一个分组的内容如下图,之后在【value_current】上进行排序。需要说明一点,在特定维度里使用【Country】,只会影响组内数据的排列顺序,并不会对【rank_current】的计算结果产生影响。但如果【Country】不出现在特定维度里,那么这个字段将加入到分组依据中,这种情况下,每个组只有一条数据,【rank_curent】恒等于1。

从这里也可以看出来,标记框中加入这么多字段,看似没有发挥任何作用,但是如果没有这些字段为后续的计算提供分组依据,value类和rank类等新字段的计算就会出错。

  • 接下来,对调整Y轴。具体如下:

  • 之后,在【行】中再复制一个【@y_inter】,然后设置【双轴】及【同步轴】,其最终显示结果如下:

  • 然后在【标记】框中更改第二个【@y_inter】的显示方式。将该【标记】框中的图形更改为【多边形】,然后将【point】拖拽到【路径】中。具体如下:

  • 至此,动态图的基本框架已经完成了,其呈现的结果如下:

4) 美化动态图,添加必要的信息提示

所做的美化主要包括以下几点:

  • 在point=1和point=3的位置上分别添加上【Country】和【value_inter】信息,此时需要创建一个新的【label】字段,其公式如下:

由于【label】是针对point做的信息提示,所以需要将字段拖拽到如下位置上。

然后设定提示信息的显示位置:

  • frame从2018.0开始页面上就不再展示数据了,这一部分数据改怎么删除掉?需要添加一个筛选器字段。最简单的做法就是直接将【rank_inter】直接加入到筛选器中即可。

再去看frame的话,发现frame显示从2000到2017.8,frame>=2018的数据数据已经不存在了。 

  • 修改标题名称并设置居中。

  • 在动态图的右下方显示年份信息,这个需要重新打开一个工作表,最后将两张工作表在故事面板中拼接。

新工作表如下。(这里也添加上【rank_inter】筛选器)。

最后进行拼接:

完成。

补充资料

若我们在原始的【gdp】表中不做数据扩展(即删除表中Year=2018的所有数据),也可以实现GDP的动态排名。只需要更改【value_next】和【rank_next】的计算公式,更改如下:

这种情况下就不需要增加筛选器了。 

其他资料

1.特定维度的作用: https://blog.csdn.net/yeshang_lady/article/details/106091735

2.这个也可以用Python的Matplotlib实现类似的动态图:https://blog.csdn.net/yeshang_lady/article/details/106040579

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值