桑基图挺好看的,用于观察不同门类之间的从属关系,并且绘制很漂亮的结构图,当然可以用于很多个地方。这里我们用微生物组数据的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")
联系客服