【R画图学习4】桑基图

桑基图,其实我用的不太多。最近常见还是在分析单细胞数据的时候,展示细胞通讯用的比较多的一种类型的图。例如下面一张就是cellchat画的一张桑基图。

x先看一下,百度对于桑基图的定义。桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,右图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的“蒸汽机的能源效率图”而闻名,此后便以其名字命名为“桑基图”。

所以从定义来看,一个简单的桑基图应该具备,node和link。node分为source node和target node。而link衡量source node和target node之间的数据流量的大小。

library(networkD3)

library(ggplot2)

我们先来设置一个简单的node和link文件

nodes = data.frame("name" =

                    c("Node A", # Node 0

                      "Node B", # Node 1

                      "Node C", # Node 2

                      "Node D"))# Node 3

links = as.data.frame(matrix(c(

  0, 1, 10, # Each row represents a link. The first number

  0, 2, 20, # represents the node being conntected from.

  1, 3, 30, # the second number represents the node connected to.

  2, 3, 40),# The third number is the value of the node

  byrow = TRUE, ncol = 3))

names(links) = c("source", "target", "value")

从简单的测试数据来看,我们给定了4个node,并且设置了source node和target node之间的数据流动情况。需要注意的是node是从0开始计数的,这点和java一样。

sankeyNetwork(Links = links, Nodes = nodes,Source = "source", Target = "target",Value = "value", NodeID = "name",fontSize= 12, nodeWidth = 30)

出来就是一个简单的桑基图的样子。value表示这些链接与之关联的值,该值由链接的厚度表示。在示例中,连接节点A和节点B的第一条链接的宽度是连接A和C的第二条链接的宽度的一半。

这个函数的详细参数解释,大家也可以自己看下。Links指的就是我们输入的node之间的links文件,Nodes文件就是node的指定文件。Source,Target,Value和NodeID指定source、target、value和name。

下面测试一下我们自己的数据,先来一个简单点的。

这个是我们的第一个简单的测试数据:

links <- read.csv("links.csv",header = T, fileEncoding = "UTF-8-BOM")

nodes <- read.csv("nodes.csv", header = T, fileEncoding = "UTF-8-BOM")

我们从csv文件读入,后面fileEncoding主要是为了处理编码问题,有时候不知道为什么会出现乱码,主要是中文等格式的问题。

sankeyNetwork(Links = links, Nodes = nodes,

              Source = "source",

              Target = "target",

              Value = "value",

              NodeID = "name",

              fontSize = 12,

              nodeWidth = 30,

              nodePadding = 8

)

画图的函数和前面一样。而 fontSize = 12, 表示节点的字体大小;nodeWidth = 30, 表示节点的宽度;nodePadding = 8 表示节点之间的距离。

换个稍微复杂点的数据集试下:

nodes <- read.csv("nodes1.csv",header = T, fileEncoding = "UTF-8-BOM")

links <- read.csv("links1.csv",header = T, fileEncoding = "UTF-8-BOM")

sn <- sankeyNetwork(Links = links, Nodes = nodes, Source = "source",

              Target = "target", Value = "value", NodeID = "name",

              units = "TWh", fontSize = 8, nodeWidth = 30)

也可以自己修改node或者link的颜色。

官网是这样说的:You can use this information to create a JavaScript color attribution object and call it using the Nodegroup argument.

就是我们可以自己创建一个javascript的颜色,好像java写的包,还真是麻烦。

my_color <- 'd3.scaleOrdinal() .domain(["c1", "c2","c3"]) .range(["red", "steelblue","green"])'   //我们根据每个node的group来指定颜色。

sankeyNetwork(Links = links, Nodes = nodes, Source = "source",

              Target = "target", Value = "value", NodeID = "name",

              units = "TWh", fontSize = 8, nodeWidth = 30, colourScale=my_color, NodeGroup="group")

感觉这个包颜色设置不太方面。

可以根据link的分类来分别设置颜色。

my_color <- 'd3.scaleOrdinal() .domain(["c1", "c2","c3","type_a","type_b","type_c","type_d"]) .range(["red", "blue","green","#69b3a2", "steelblue", "grey","cyan"])'

sankeyNetwork(Links = links, Nodes = nodes, Source = "source",

              Target = "target", Value = "value", NodeID = "name",

              units = "TWh", fontSize = 8, nodeWidth = 30, colourScale=my_color, NodeGroup="group",LinkGroup="group")

还有一个问题,真个生成的是html,如果我们想转化成我们常规的图片格式,需要安装这个包:

install.packages("webshot")

 if(!is_phantomjs_installed()){

  install_phantomjs()

}

library(webshot)


sn<-sankeyNetwork(Links = links, Nodes = nodes, Source = "source",

              Target = "target", Value = "value", NodeID = "name",

              units = "TWh", fontSize = 8, nodeWidth = 30, colourScale=my_color, NodeGroup="group",LinkGroup="group")

saveNetwork(sn, "sn.html")

webshot("sn.html" , "sn.pdf")

就可以存成pdf格式了。

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

推荐阅读更多精彩内容