关注公众号

关注公众号

手机扫码查看

手机查看

叮!三分钟教你如何用R绘制桑基图

创新多组学技术服务
2022.8.31
c729c1aacb469497499dea2346d1d14d.gif

ae3a1d3a0d30e46ad24e84691819a6bd.jpeg

c69995bbb1b5108c5572ac6663c3cb03.gif

桑基图(Sankey diagram),即桑基能量分流图,是一种展示数据流的可视化方式,根据延伸的分支的宽度对应数据流量的大小,比较适用于用户流量等数据的可视化分析。


桑基图的特点是能量守恒,即数据从开始到结束,总量都保持不变。

5db28d314f5a8d70c9a94d703e91a175.gif

怎样使用R语言脚本实现桑基图的绘制?不废话,直接上硬菜!我们一起来看看怎么用吧!具体代码及注释如下:

54e2178f27fa8e2f1ee32e417096b5ec.gif

第一步:准备工作

环境:R(推荐安装RStudio)、ggsankey包、ggplot2包、dplyr包、RColorBrewer包


输入文件:sankey.txt对应关系文件,第1列为id名,第2列转录因子家族,第3列差异转录因子,第4列差异靶标基因

79291dd019c69244cff80340e207146b.png


第二步: 对输入数据文件进行处理

# 载入脚本分析所需包library(ggsankey)library(ggplot2)library(dplyr)library(RColorBrewer)
# 读入sankey.txt文件数据,以第一列作为rownamesfll <- read.table("sankey.txt", sep = "\\t", header = T, row.names = 1)
# 定义名为ab的函数,若输入参数x的字符数大于13,则截取前十个字符,其作用为省略过长的 Family 名,若参数x的字符数小于13,则不做变动ab <- function(x) {    ifelse(nchar(x) > 13, paste0(substr(x, start = 1, stop = 10), "..."), x)}
# 对fll数据框的每个Family列都使用一次ab函数,包裹在vapply框架下可以预先指返回值类型,使得到的结果更加安全fll$Family <- vapply(fll$Family, ab, "c", USE.NAMES = F)
# %>%为管道符,data.frame(fll)的输出传递给了make_long(colnames(fll)),最终结果赋值为ddf,使用管道符的原因:r每次赋值都会占用相应的内存,管道符可以有效减少赋值以减少内存占用同时简化美观代码,注:需加载dplyr包,不然会报错ddf <- data.frame(fll) %>% make_long(colnames(fll))


第三部: 作图并保存画布

# 使用ggplot作图, +号可理解为添加图层, 图层按照+的顺序不断覆盖, 最后生成图片,注:ggplot, aes, alluvial的参数非常多,可自行修改或添加别的参数进行个性化绘图p <- ggplot(ddf, aes(    # 左侧是ggsankey的参数名, 右侧是输入数据中的变量名    x = x,    next_x = next_x,    node = node,    next_node = next_node,    fill = factor(node),    label = node)) +    geom_alluvial(flow.alpha = 0.5, node.color = NA, width = .3, smooth = 8) +    geom_alluvial_text(size = 3, color = 1) +    scale_fill_manual(values = rainbow(56)) +    theme_alluvial(base_size = 16) +    theme(legend.position = "none") +    theme(        axis.text.y = element_blank(),        axis.ticks.y = element_blank(),        axis.title.x = element_blank()    ) +    # coord_系列函数可改变x与y轴的位置, 默认使用coord_cartesian, 不做处理    coord_cartesian(expand = FALSE)
# 使用ggsave将画布的图像保存至当前路径,此处定义的输出文件为pdf格式,宽度为8ggsave("sankey.pdf", p, "pdf", width = 8)


第四部:结果图片示例解读

2ce806273d6656e92f42622dce159918.png


图片说明:从左至右,第一列转录因子家族;第二列差异转录因子;第三列差异靶标基因。中间线条表示转录因子家族、转录因子、靶标基因对应关系。


各列可以从线条的走向,粗细的变化和节点间的比较三个方面来分析结果。从组成结构可以看出,桑基图的数据其实是一个网状结构,构成了一个network。和普通的发散性的网络不同,在桑基图中,数据总是从source流动到了target,而且1个source会对应多个target, 1个target也会有多个source, 为了更加量化的展示同一个节点不同流入/流出数据的比例,采用了link的宽度这一属性,可以看到link的宽度与矩形节点的高度是呈比例的,source节点的所有流出数据的link总宽度等于节点的高度,对应target节点,则所有流入数据的link的总宽度等于节点的高度。

54e2178f27fa8e2f1ee32e417096b5ec.gif

综上,桑基图的输入数据就是一个网络,其可视化的重点在于展示数据的线性流动,需要注意的是,桑基图中只有节点的概念,没有层级的概念,就是说我们只需要输入两两节点之间的连线关系,而桑基图可视化工具会自动计算节点的位置。

b732e6a20d4caf2d4eacb7f60c6d2abc.png

END

排版人:小久


原创声明:本文由欧易生物(OEBIOTECH)学术团队报道,本文著作权归文章作者所有。欢迎个人转发及分享,未经作者的允许禁止转载。

5c4c19d1dd9d89f9695cd31c37e2b169.gif
5fffaef5b20ef00879de5a62eaff5cc2.gif

点击“阅读全文” 收获更多精彩

文章作者
推荐
关闭