打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一条代码带大家绘制交互式+pdf+png等多格式桑基美图

写在前面

桑基图挺好看的,用于观察不同门类之间的从属关系,并且绘制很漂亮的结构图,当然可以用于很多个地方。这里我们用微生物组数据的phyloseq对象,很快很方便的为大家构建一个桑基图。所以如果你有phyloseq对象直接来试试吧。本文测试数据来源于ggClusterNet,大家从github上下载使用。

实战

导入需要R包

library(ggClusterNet)
library(tidyverse)
library(phyloseq)
library(tidyverse)
library(viridis)
library(patchwork)
library(networkD3)
data(ps)

我们将微生物数据按照属水平合并,然后取前五十个丰度最高的属,然后去除Unassigned”) %>%  vegan_tax() %>%的微生物。注意这几个函数存在于ggClusterNet中,注意下载安装。

tax = ps %>%
ggClusterNet::tax_glom_wt(ranks = 6) %>%
filter_OTU_ps(50) %>%
subset_taxa(Genus != "Unassigned") %>%
vegan_tax() %>%
as.data.frame()
head(tax)

构建连接,一个源—-一个目标。标记一下不同分类等级的标签。

id2 = c("k","p","c","o","f","g")
dat = NULL
for (i in 1:5) {
dat <- tax[,c(i,i+1)] %>% distinct(.keep_all = TRUE)
colnames(dat) = c("source","target")
dat$source = paste(id2[i],dat$source,sep = "_")
dat$target = paste(id2[i+1],dat$target,sep = "_")
if (i == 1) {
dat2 = dat
}

dat2 = rbind(dat2,dat)

}

dim(dat2)
# dat2 = dat2 %>% distinct(.keep_all = TRUE)

head(dat2)

构造丰度表格,这里我们仅仅对KO1这单个样本进行丰富提取:

otu = ps %>%
ggClusterNet::tax_glom_wt(ranks = 6) %>%
scale_micro() %>%
filter_OTU_ps(50) %>%
subset_taxa(Genus != "Unassigned") %>%
vegan_otu() %>%
t() %>%
as.data.frame()

head(otu)
otutax = cbind(otu,tax)

id = rank.names(ps)[1:6]
dat = NULL
for (i in 1:6) {
dat <- otutax %>%
group_by(!!sym(id[i])) %>%
summarise(sum(KO1))
colnames(dat) = c("target","value")
dat$target = paste(id2[i],dat$target,sep = "_")
if (i == 1) {
dat3 = dat
}

dat3 = rbind(dat3,dat)
}

dat4 <- dat2 %>% left_join(dat3)
sankey = dat4

构造节点和连接表格,保存html文件,pdf和png文件。

nodes <- data.frame(name = unique(c(as.character(sankey$source),as.character(sankey$target))),stringsAsFactors = FALSE)
nodes$ID <- 0:(nrow(nodes)-1)
sankey <- merge(sankey,nodes,by.x = "source",by.y = "name")
sankey <- merge(sankey,nodes,by.x = "target",by.y = "name")
colnames(sankey) <- c("X","Y","value","source","target")
sankey <- subset(sankey,select = c("source","target","value"))
nodes <- subset(nodes,select = c("name"))

ColourScal='d3.scaleOrdinal() .range(["#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999"])'

sankey$energy_type <- sub(' .*', '', nodes[sankey$source + 1, 'name'])

p <- sankeyNetwork(Links = sankey, Nodes = nodes,
Source = "source",Target = "target",Value = "value",
NodeID = "name",
sinksRight=FALSE,
LinkGroup = 'energy_type',
colourScale= ColourScal,
# nodeWidth=40,
# fontSize=13
# nodePadding=20
)
p

saveNetwork(p,"sankey1.html")
library(webshot)

webshot("sankey.html" , "sankey.png")
webshot("sankey.html" , "sankey.pdf")

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
怎样用Python绘制诱人的桑基图?
Python实现Sankey Diagram 绘制
Cytoscape中文教程(1)
Cytoscape插件5:DisGeNET(1)
Gnuplot (三)输出图片/字体支持、eps/png/pdf/enhanced文本
教你用pyecharts制作交互式桑基图,赶快学起来吧!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服