桑基圖怎麼看怎麼畫(附R代碼)

什麼是桑基圖

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

用一個故事來介紹一下桑基圖:



這個非常著名的圖是Charles Minard在1869年所作的拿破崙東征俄國的信息圖。Charles Minard是信息圖表的之父,他是信息圖領域的創始者。這張圖描繪的是拿破崙在1812到1813年進攻俄國的情況。它的背景是一個真實的地圖,西邊是波蘭的邊境,東邊是莫斯科。圖上那條主線的寬度代表拿破崙軍隊的人數,黃色表示進攻路線,黑色表示撤退的路線: 他開始於42萬人,在向莫斯科進軍的過程中喪失了很多人,到達莫斯科時只剩下10萬人,而最後從莫斯科活着返回的只剩下1萬人。

爲什麼說這個圖好呢,因爲除了主線的寬度之外,這張圖還告訴了你更多的東西。畫面下面的折線圖告訴你當時的溫度,其中最高的點是0度,最低到達過零下30度,回城的黑線周圍嗨標註了月份,可以看出,拿破崙的軍隊在達打到莫斯科的時候已經是將近十月分了,等到完全撤離俄國已經是12月份了,如果你仔細觀察,會發現在撤退過程中他們路過了一條叫Studienska的河,軍隊人數在河兩岸出現了劇減,原來那個時候天氣寒冷,軍隊長促情況下淌水過河,於是在這條寒冷的河中凍死了很多人。

根據Edward Tufte所總結的信息設計原則:

  • 這個圖讓顯示出了比較關係(Show comparisons, contrasts, differences),比如軍隊人數的起始時候的寬度和結束時候的寬度的強烈對比,比如過那條河流的時候軍隊人數的劇烈的變化等等。
  • 這個圖解釋了因果關係(Show causality, mechanism, structure, explanation),比如時間,溫度和軍隊人數的關係。
  • 這個圖有多個變量(Multivariate analysis),1), 軍隊人數。 2), 地理的位置(經度和緯度)3), 軍隊的行進方向。 4), 溫度。 5), 時間。

所有的這些信息都不是獨立存在的,他們結合在一起,將觀衆帶入當時的拿破崙的旅程,同時能讓人感受到無情的戰爭奪走人們生命的痛苦。

桑基圖怎麼看
  • 線條的走向
  • 粗細的變化
  • 節點間的比較
繪製屬於自己的桑基圖

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

library(ggalluvial)
#install.packages("ggalluvial")
library(reshape2)
mydata<-read.table("igraph//otu_table_group.g.relative.xls",header = T,sep = "\t")
mydata<-head(mydata,n=10)
mydata<-mydata[,-length(colnames(mydata))]
mydata<-melt(mydata,variable.name="Group",value.name="Abundance")
head(mydata)

ggplot(data = mydata,
       aes(axis1 = Taxonomy, axis2 = Group,
           weight = Abundance)) +
  scale_x_discrete(limits = c("Taxonomy", "Group"), expand = c(.01, .05)) +
  geom_alluvium(aes(fill = Taxonomy)) +
  geom_stratum() + geom_text(stat = "stratum", label.strata = TRUE) +
  #theme_minimal() +
  #theme_tropical()
  ggtitle("Taxonomy abundance in each group")

我們可以把各個層級都畫出來,這樣看的更具體:

library(reshape2)
library(ggalluvial)
library(tidyverse)
mydata<-read.table("igraph//otu_table_group.g.relative.xls",header = T,sep = "\t")
mydata<-head(mydata,n=10)
mydata<-separate(data = mydata, col = Tax_detail, into = c("k", "p","c","o","f","g"), sep = ";")
#mydata$Tax_detail=  gsub(";","\t",mydata$Tax_detail)

#mydata<-mydata[,-length(colnames(mydata))]

mydata<-melt(mydata,variable.name="Group",value.name="Abundance")
mydata$genus<-mydata$g
ggplot(data = mydata,
       aes(axis1 = k, axis2 = p,axis3 = c,axis4 = o,axis5 = f,axis6 = g,axis7 = Group,
           weight = Abundance)) +
  scale_x_discrete(limits = c("k", "p","c","o","f","g","Group","Abundance"), expand = c(.01, .05)) +
  geom_alluvium(aes(fill = genus)) +
  geom_stratum() + geom_text(stat = "stratum", label.strata = TRUE) +
  #theme_minimal() +
  #theme_tropical()
  #theme_matrix()
  theme_bvbw()
  ggtitle("Taxonomy abundance in each group")

最後,畫一個DNA:

#install.packages("riverplot")
library( riverplot )
plot.new()
par( usr= c( 0, 4, -2.5, 2.5 ) )
w <- 0.4
cols <- c( "blue", "green" )
init <- c( -0.8, -0.5 )
pos <- c( 1, -1 )
step <- 0.5
for( i in rep( rep( c( 1, 2 ), each= 2 ), 5 ) ) {
  curveseg( init[i], init[i] + step, pos[1], pos[2], width= w, col= cols[i] )
  init[i] <- init[i] + step
  pos <- pos * -1
}

兩種不同的信息可視化
Sankey diagram
百度百科||桑基圖
桑基圖有何作用,桑基圖又是怎麼做出來的?
riverplot繪製桑基圖
流量結構分佈圖——桑基圖(Sankey)
Alluvial Diagrams in ggplot2
ggalluvial:衝擊圖展示組間變化、時間序列和複雜多屬性alluvial diagram
BioSankey
Calypso

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