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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章