R绘图(5): 一文学会桑基图的画法

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

前两天正好碰到了这类“数据流量”的可视化问题,因此花了点时间学习了一下桑基图的画法,比较简单,在这里给大家演示一下:

我自己编了一个数据,如下图所示

左边是数据的流向,右边是用表格的形式重写,左图的每一个箭头对应右图的每一行,画桑基图时用到的数据就是右边格式的表格。

下面就是代码

library(networkD3)
library(tidyverse)
library(RColorBrewer)

#读取刚才的数据框,给列命名
df=read.table("test.txt",header = F,sep = "\t",stringsAsFactors = F)
colnames(df)=c("source","target","value")

#图形中的所有节点
df.nodes <- data.frame(
  name=c(as.character(df$source), 
         as.character(df$target)) %>% unique()
)

#将source和target重新编号
df$IDsource <- match(df$source, df.nodes$name)-1 
df$IDtarget <- match(df$target, df.nodes$name)-1

#这一步是为了给flow自定义颜色,单独定义了一列
df$group="flow"

#配置颜色部分,形式相对固定,不必纠结具体的语法规则
#编码对应的颜色可以用RColorBrewer包结合scales包查看
my_color <- 'd3.scaleOrdinal() 
            .domain(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J","flow"]) 
            .range(["#8DD3C7", "#FFFFB3", "#BEBADA", "#FB8072", "#80B1D3", "#FDB462", "#B3DE69", "#FCCDE5",  "#BC80BD", "#CCEBC5","#BDBDBD"])'

#画图
Sankey.p <- sankeyNetwork(Links = df, Nodes = df.nodes,
                   Source = "IDsource", Target = "IDtarget",
                   Value = "value", NodeID = "name", LinkGroup = "group",colourScale=my_color, 
                   sinksRight=FALSE, nodeWidth=25, nodePadding=10, fontSize=13,width=900)
Sankey.p
#画出来的图形,还可以直接在R窗口中调整方块上下位置,不过还是建议保存为pdf后用AI调整
#nodeWidth每个节点方块的宽度
#nodePadding每一列节点方块之间在纵向上的间隔
#width是图形横向的宽度

#保存为pdf
library(htmlwidgets)
saveWidget(Sankey.p, file="Sankey.html")
library(webshot)
webshot("Sankey.html", "Sankey.pdf")

最后的效果是这样的,嗯…还需调整


公众号后台回复20210325,获取今天的代码和测试数据

因水平有限,有错误的地方,欢迎批评指正!

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
桑基图(Sankey diagram)是一种流程图,用于表示流量、能量、材料等资源在系统内部的转移。在R语言中,可以使用包ggplot2和ggalluvial来创建桑基图。 首先,我们需要安装并加载这两个包: ```r install.packages("ggplot2") install.packages("ggalluvial") library(ggplot2) library(ggalluvial) ``` 然后,我们可以使用以下代码创建一个简单的桑基图: ```r data <- data.frame(from = c("A", "A", "B", "B", "C"), to = c("B", "C", "C", "D", "D"), value = c(10, 20, 30, 40, 50)) ggplot(data, aes(axis1 = from, axis2 = to, y = value)) + geom_alluvium(aes(fill = from), width = 0.1) + geom_stratum(width = 1/8, fill = "grey", color = "black") + theme_void() ``` 这将创建一个包含三个节点的桑基图,其中节点A、B和C之间的流量表示为从A到B、从A到C、从B到C、从B到D和从C到D的线。 我们还可以自定义桑基图的颜色、标签和样式。例如,以下代码创建一个包含四个节点的桑基图,其中节点A、B、C和D之间的流量表示为从A到B、从A到C、从B到C、从B到D、从C到D和从C到A的线: ```r data <- data.frame(from = c("A", "A", "B", "B", "C", "C"), to = c("B", "C", "C", "D", "D", "A"), value = c(10, 20, 30, 40, 50, 60)) ggplot(data, aes(axis1 = from, axis2 = to, y = value)) + geom_alluvium(aes(fill = from), width = 0.1) + geom_stratum(width = 1/8, fill = "grey", color = "black") + scale_fill_manual(values = c("#E69F00", "#56B4E9", "#009E73", "#F0E442")) + ggtitle("Customized Sankey Diagram") + theme_void() + theme(plot.title = element_text(hjust = 0.5, size = 20, face = "bold"), axis.text.y = element_text(size = 16), axis.text.x = element_text(size = 16), axis.title = element_blank()) ``` 此代码将节点A、B、C和D分别着色为橙色、蓝色、绿色和黄色,并添加了标题和自定义字体大小和样式。 总之,R语言中的ggplot2和ggalluvial包提供了创建自定义桑基图的灵活和简单的方法,可以用于可视化各种类型的数据流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值