R数据可视化17:桑基图

感觉100年没有上简书,近2个月忙于毕业论文以及公众号推文,没有时间更文章。终于前几天交了论文呢,可以回来更文了。没错我只是在为我的懒惰寻找接口,今天我们来讲一下桑基图(Sankey diagram)。P.S.最近觉得有必要好好认真系统地学习一下机器学习,可能之后也会整理发个简书系列,书我已经买好了就差看了。

什么是桑基图(Sankey diagram)

先来给大家展示几张桑基图的图片,帮助大家迅速对桑基图建立一个直观的概念。

浮夸的桑基图:水利循环系统
文献里的桑基图:展示了克罗恩病患者的菌群变化 图片来源:https://www.biorxiv.org/content/10.1101/772483v1.full

在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: 火山图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281