分析测试百科网

搜索

分析测试百科网 > 行业资讯 > 微信文章

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

创新多组学技术服务
2022.8.31

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

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

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

第一步:准备工作

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

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

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

# 载入脚本分析所需包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)

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

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

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

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

发布需求
作者
头像
仪器推荐
文章推荐