流量結構分布圖——桑基圖(Sankey)

桑基圖作為相對複雜的圖表種類,平時很少用到,不僅僅是因為它的引用場景相對狹窄,另一方面則是製作難度相對較大,門檻較高。

不過針對第一個問題,如果你能很好地理解自己所涉及到的業務數據結構及想要表達和呈現的維度信息,那麼關鍵時刻使用桑基圖確實會讓你的報告錦上添花。

桑基圖用於表達流量分布於結構對比,最初的發明者使用它來呈現能量的流動與分布。

百度百科給了桑基圖相對完善的解釋:

桑基圖(Sankey diagram),即桑基能量分流圖,也叫桑基能量平衡圖。它是一種特定類型的流程圖,圖中延伸的分支的寬度對應數據流量的大小,通常應用於能源、材料成分、金融等數據的可視化分析。因1898年Matthew Henry Phineas Riall Sankey繪製的「蒸汽機的能源效率圖」而聞名,此後便以其名字命名為「桑基圖」。

因1898年Matthew Henry Phineas Riall Sankey繪製的「蒸汽機的能源效率圖」而聞名,此後便以其名字命名為「桑基圖」。

桑基圖最明顯的特徵就是,始末端的分支寬度總和相等,即所有主支寬度的總和應與所有分出去的分支寬度的總和相等,保持能量的平衡。

現如今的可視化軟體行業如此發達,製作此類桑基圖已絕非難事,從最高端的JS庫(D3、Ecgarts、highlight)到主流的數據科學編程工具(R、Python等)亦或者人人都能上手的自助式BI工具(PowerBI、Tableau等)都可以勝任此項工作。

本文將著重分享使用R語言中的d3network工具包以及PowerBI可視化工具來製作桑基圖的大致過程(Tableau的桑基圖還是太繁瑣,這裡不再展示,感興趣可以自己探索)。

R中有兩個包有現成的桑基圖函數:

Networkd3、d3Network,包名大同小異,而且函數的參數都是一樣的,很懷疑是不是同一批人搞的。

桑基圖的數據結構很簡單,只有三列數據信息:

  • 起點:

  • 終點:

  • 權重:

雖然只有三列數據,但是桑基圖可以做出多級節點,在數據整合上,我們需要事前現將所有節點對應的起點、終點和權重值都順序的縱向合併為三列欄位。

第一個圖是我們要呈現的原始數據,這樣看來有兩組對應關係,即大區對應地區、地區對應省份,我們如果要呈現這兩組信息,只篩選出大區與地區對應關係及其權重值、地區與省份對應關係及其權重值,並將兩組三變數數據表進行列對齊合併。(說的有點繞了,其實就是圖表上有多少節點對,那麼數據就有多少個三變數觀測值)。

以下是R語言代碼的實現過程:

library(Networkd3)

library("d3Network")

library(xlsx)

setwd("D:/R/File/")

Sankey<-read.xlsx("D:/R/File/SankeyData.xlsx",sheetName="Data",header=T,encoding=UTF-8,stringsAsFactors=FALSE,check.names=FALSE)nSankeylinks<-SankeynSankeynodes<-data.frame(name=unique(c(Sankeylinks$Source,Sankeylinks$Target)),stringsAsFactors=FALSE) nSankeynodes$index<-0:(nrow(Sankeynodes) - 1)nSankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="Source",by.y="name")nSankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="Target",by.y="name")n

Sankeydata<-Sankeylinks[,c(4,5,3)];names(Sankeydata)<-c("Source","Target","Value")nSankeyname<-Sankeynodes[,1,drop=FALSE]n

使用d3Network包中的桑基圖函數實現:nd3Sankey(Links=Sankeydata,Nodes=Sankeyname,Source="Source",Target="Target",Value="Value",NodeID="name", nfontsize=12,nodeWidth=30,file="TestSankey.html")n

遺憾的是該包對中文支持不夠友好~

#------------------------------------------

使用Networkd3包裡面的桑基圖函數實現:nsankeyNetwork(Links=Sankeydata,Nodes=Sankeyname, Source ="Source",nTarget = "Target", Value = "Value", NodeID = "name",nunits = "TWh", fontSize = 12, nodeWidth = 30)n

這次出來的結果還是挺滿意的:

以上兩種方式做出來的動態圖表(調用了D3的在線圖形庫,格式是html格式的,如果你需要將HTML嵌入PPT中使用,那麼本公眾號早前曾經推送過一篇此類文章,講解如何在PPT中嵌入HTML對象)。

將html格式動態圖表網頁嵌入ppt中

PowerBI版講解:

接下來講解如何在PowerBI中實現以上桑基圖效果,因為改圖表並未包含在PowerBI的內置基礎圖表庫中,所以我們需要在他的在線社區中下載該圖表的可視化插件。

Custom visuals for Power BI

關於如何下載PowerBI圖形可視化插件,如何導入、載入和使用,此前的另一篇文章中也介紹的很詳細。

當PowerBI遇到R語言

然後導入你的桑基圖數據源:

拖入對應欄位:(仍然是三個欄位,起點,終點,權重)

保存本地文件,並發布到PowerBI的雲空間:

如果你還沒有申請PowerBI的賬戶,那麼最好去他的平台申請一個(提示需要使用教育郵箱或者工作郵箱,即.com.edu結尾的)。

發布成功之後,你的PowerBI控制項中就存在此圖表對象,以後你更新本地的那個PowerBI文件的時候,只需點擊發布,空間中的對象也會同步更新。

然後打開你的PPT(需13及16版以上才可以)的應用商店內找到PowerBIFile插件。

點擊添加,輸入之前申請的賬號密碼,就會出現你的已存儲的儀錶盤對象,點擊對應的桑基圖對象,就可以完成導入。

導入後的桑基圖無論是在PPT的編輯狀態還是PPT的放映狀態都可以保留所有的動態效果。(這就是微軟的PowerBI與office平台對接後帶來的強大優勢,非常適合作為大屏幕交互演示來蹭亮點)

最後好像再強調一遍,Sankey是特定場景下呈現流量關係與結構對比所使用的,不要覺得這種圖表很炫酷就各種亂用,數據可視化的要義很重要的一條就是,不可亂用圖表,適當的場景使用合適的圖表。

聯繫方式:

wechat:ljty1991

Mail:578708965@qq.com

個人公眾號:數據小魔方(datamofang)

團隊公眾號:EasyCharts

qq交流群:[魔方學院]553270834


推薦閱讀:

可視化設計中的形式美法則
數據分類排排坐
大家說的智慧出遊,到底指的是什麼?

TAG:R编程语言 | 数据可视化 | 图表 |