感覺100年沒有上簡書,近2個月忙于畢業論文以及公眾號推文,沒有時間更文章。終于前幾天交了論文呢,可以回來更文了。沒錯我只是在為我的懶惰尋找接口,今天我們來講一下桑基圖(Sankey diagram)。P.S.最近覺得有必要好好認真系統地學習一下機器學習,可能之后也會整理發個簡書系列,書我已經買好了就差看了。
什么是桑基圖(Sankey diagram)
先來給大家展示幾張桑基圖的圖片,幫助大家迅速對桑基圖建立一個直觀的概念。
在Wiki的介紹中,講桑基圖描述為“是一種流程圖,其中箭頭的寬度與流速成正比”。不過實際上桑基圖可以展示很多方面的內容,包括一些動態的變化比如移民情況,還可以展示數據的具體來源等等。
雖然此類圖在文章中出現的頻率不高,但是有時候,尤其是在做純生信或者生信內容占比較大的文章時,我們需要使用多樣的可視化方式,不能總是使用箱型圖、柱狀圖等,此時,不妨考慮一下桑基圖。
這里舉個具體的例子,下面這張桑基圖展示了移民情況,顯示了從一個國家(左)移居到另一個國家(右)的情況。
從上圖中,我們可以看到Europe、North America和West Asia是接受最多移民的地區。而South Asia、Latin America、Africa、East Asia是移民去其他國家最多的國家。
進一步,我們還可以了解到Europe的移民主要來自Afica、Europe、Latin America,而North America則主要來自Latin America,West Asia主要來自South Asia。
雖然我們可以用多個柱狀圖展示上述信息,但是可能就會十分復雜,也不好比較,而桑基圖可以同時展示多個組的變化信息,畢竟支持進行不同組之間的比較。
怎么做桑基圖
偷個懶,我們這次就完全基于下述鏈接的代碼來作圖:Sankey作圖
用networkD3包中的sankeyNetwork功能進行繪圖。
1)需要什么格式的數據
做桑基圖所需要的數據有點麻煩,主要需要兩類數據,一個是包括節點和數值在內的表,另一個是純粹的節點的表。
head(data_long)
source target value IDsource IDtarget
1 Africa Africa 3.142471 0 10
2 East Asia East.Asia 1.630997 1 11
3 South Asia East.Asia 0.525881 2 11
4 South East Asia East.Asia 0.145264 3 11
5 Africa Europe 2.107883 0 12
6 East Asia Europe 0.601265 1 12
head(nodes)
name
1 Africa
2 East Asia
3 South Asia
4 South East Asia
5 Europe
6 Latin America
2)如何作圖
library(tidyverse)
library(viridis)
library(patchwork)
library(networkD3)
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/13_AdjacencyDirectedWeighted.csv", header=TRUE)
data_long <- data %>%
rownames_to_column %>% #將行名變為普通的列
gather(key = 'key', value = 'value', -rowname) %>% #矩陣轉化為作圖需要的格式
filter(value > 0) #篩選value即移民數大于0的
colnames(data_long) <- c("source", "target", "value")#改變列名
data_long$target <- paste(data_long$target, " ", sep="")#加上空格以便于區分target和source
nodes <- data.frame(name=c(as.character(data_long$source), as.character(data_long$target)) %>% unique())#制作nodes
data_long$IDsource=match(data_long$source, nodes$name)-1
data_long$IDtarget=match(data_long$target, nodes$name)-1
ColourScal='d3.scaleOrdinal() .range(["#F7FBFF", "#DEEBF7", "#C6DBEF", "#9ECAE1" ,"#6BAED6", "#4292C6" ,"#2171B5" ,"#084594"])'
sankeyNetwork(Links = data_long, Nodes = nodes,
Source = "IDsource", Target = "IDtarget",
Value = "value", NodeID = "name",
sinksRight=FALSE, colourScale=ColourScal, nodeWidth=40, fontSize=13, nodePadding=20)
如果不導出pdf的話,可以看到實際上是一個有互動的圖。比如,將鼠標放在某一條link上,這條link就會變成深灰色,所以十分適合用于在網頁上展示。其實從函數介紹中也可以看出來,"Create a D3 JavaScript Sankey diagram"
其中的幾個參數意義如下:
sinksRight:調整圖片的位置,如果修改為T,圖片會不留邊,從右側邊界開始制圖
nodeWidth:此圖藍色的方框的寬度
nodePadding:調整不同方框間的高度和寬度
當然,我們還可以考慮使用在線網站制圖sankeymatic。
今天就分享到這里啦。
往期R數據可視化分享
R數據可視化16:啞鈴圖
R數據可視化15:傾斜圖 Slope Graph
R數據可視化14:生存曲線圖
R數據可視化13:瀑布圖/突變圖譜
R數據可視化12: 曼哈頓圖
R數據可視化11: 相關性圖
R數據可視化10: 蜜蜂圖 Beeswarm
R數據可視化9: 棒棒糖圖 Lollipop Chart
R數據可視化8: 金字塔圖和偏差圖
R數據可視化7: 氣泡圖 Bubble Plot
R數據可視化6: 面積圖 Area Chart
R數據可視化5: 熱圖 Heatmap
R數據可視化4: PCA和PCoA圖
R數據可視化3: 直方/條形圖
R數據可視化2: 箱形圖 Boxplot
R數據可視化1: 火山圖