Multiple_layout - taowenmicro/ggClusterNet GitHub Wiki


title: "Multiple_layout" author: "wentao" date: "2020/3/22" output: html_document editor_options: chunk_output_type: console chunk_output_type: console

pre code,pre,code {
  white-space:pre!important;
  overflow-x: scroll!important;
}
knitr::opts_chunk$set(echo = TRUE,
                      fig.width = 7,
                      fig.height = 5,
                      fig.align = "center",
                      warning = FALSE,
                      message = FALSE

)

写在前面

ggClusterNet中提供了多种优秀的网络可视化布局算法:

  • PolygonClusterG:环状模块,环状布局
  • PolygonRrClusterG:环状模块,模块半径正比于节点数量,环状布局
  • randomClusterG:随机布局,环状模块
  • ArtifCluster:环状模块,人工布局
  • randSNEClusterG:sna包中的布局按照模块布局
  • PolygonModsquareG 环状布局,顺序行列排布
  • PolygonRdmNodeCir 实心圈布局,环状布局

其他布局

其他布局:

  • model_Gephi.2: 模仿Gephi布局
  • model_igraph:模仿igraph布局
  • model_maptree:按照maptree算法布局模块

cor### 网络计算:计算微生物网络

#--导入所需R包#-------
library(phyloseq)
library(igraph)
library(network)
library(sna)
library(tidyverse)
library(ggClusterNet)
library(ggrepel)

data(ps)


result = corMicro (ps = ps,
                   N = 250,
                   r.threshold=0.8,
                   p.threshold=0.05
)
cor = result[1](/taowenmicro/ggClusterNet/wiki/1)
dim(cor)
ps_net = result[3](/taowenmicro/ggClusterNet/wiki/3)
otu_table = as.data.frame(t(vegan_otu(ps_net)))
tax_table = as.data.frame(vegan_tax(ps_net))








分组--模块化

对网络中的OTU进行分组:模块分组

对微生物进行模块化分析,得到微生物的分组信息

netClu  = modulGroup( cor = cor,cut = 3,method = "cluster_fast_greedy" )
head(netClu)

netClu = data.frame(ID = row.names(tax_table),group =rep(1:5,length(row.names(tax_table)))[1:length(row.names(tax_table))] )
netClu$group = as.factor(netClu$group)


布局函数:randomClusterG

randomClusterG布局函数对网络节点按照指定的分组(netClu)分类展示,随机布局:

netClu = data.frame(ID = row.names(tax_table),group =rep(1:12,length(row.names(tax_table)))[1:length(row.names(tax_table))] )
netClu$group = as.factor(netClu$group)

set.seed(1112)

result2 = randomClusterG (cor = cor,nodeGroup =netClu )
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)


# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)

#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
dim(edge)


colnames(edge)[8] = "cor"



p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.1,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum,size = mean),pch = 21, data = nodes) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1

ggsave("1.pdf",p1,width = 20,height = 19,limitsize = FALSE)

布局函数:PolygonClusterG

PolygonClusterG布局函数对网络节点按照指定的分组(netClu)分类展示,固定排布为一个环:


netClu = data.frame(ID = row.names(tax_table),group =rep(1:12,length(row.names(tax_table)))[1:length(row.names(tax_table))] )
netClu$group = as.factor(netClu$group)


set.seed(12)
result2 = PolygonClusterG(cor = cor,nodeGroup =netClu,zoom = 0.8,zoom2 = 0.8 )
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)

# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum,size = mean),pch = 21, data = nodes) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1

ggsave("2.pdf",p1,width = 20,height = 19)

布局函数:PolygonRrClusterG

PolygonClusterG布局函数对网络节点按照指定的分组(netClu)分类展示,固定排布为一个环,并且按照分组中节点数量较多的的模块大一些:


netClu  = modulGroup( cor = cor,cut = 3,method = "cluster_fast_greedy" )
head(netClu)


netClu$group = as.factor(netClu$group)




set.seed(12)
result2 = PolygonRrClusterG(cor = cor,nodeGroup =netClu,zoom2 = 2,zoom = 0.01)
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)

# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum,size = mean),pch = 21, data = nodes) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1
ggsave("3.pdf",p1,width = 17,height = 16)

布局函数:ranSNEClusterG

ranSNEClusterG布局函数对网络节点按照指定的分组(netClu)分类展示,将模块按照行列排布。值得注意的是这个函数囊括了R包sna中的多种布局方法,并且修改后进行聚类展示。layout可选的布局方式参见sna中的布局方式:"circle","adj","circrand","eigen","random"


netClu = data.frame(ID = row.names(tax_table),group =rep(1:5,length(row.names(tax_table)))[1:length(row.names(tax_table))] )
netClu$group = as.factor(netClu$group)

?ranSNEClusterG
result2 = ranSNEClusterG (cor=  cor,layout ="circrand")
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)

# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum),pch = 21, data = nodes,size = 5) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1
#
ggsave("4.pdf",p1,width = 12,height = 10)


result2 = ranSNEClusterG (cor=  cor,layout ="random")
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)

# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum),pch = 21, data = nodes,size = 4) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1

ggsave("5.pdf",p1,width = 12,height = 10)

布局函数:PolygonModsquareG

PolygonModsquareG布局函数对网络节点按照指定的分组(netClu)分类展示,将模块按照行列排布,指定排布的行数量(cut)。

netClu = data.frame(ID = row.names(tax_table),group =rep(1:50,length(row.names(tax_table)))[1:length(row.names(tax_table))] )
netClu$group = as.factor(netClu$group)

result2 <- PolygonModsquareG(cor = cor,nodeGroup =netClu,r1 = 10,N = 10,cut = 8)
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)

# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum),pch = 21, data = nodes,size =3) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())

ggsave("6.pdf",p1,width = 50,height =50,limitsize = FALSE)

布局函数:PolyRdmNotdCirG

PolygonModsquareG布局函数对网络节点按照指定的分组(netClu)分类展示,将模块按照行列排布


netClu = data.frame(ID = row.names(tax_table),group =rep(1:3,length(row.names(tax_table)))[1:length(row.names(tax_table))] )
netClu$group = as.factor(netClu$group)

result2 = PolyRdmNotdCirG (cor = cor,nodeGroup =netClu )

node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)

# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum),pch = 21, data = nodes,size = 3) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1

ggsave("8.pdf",p1,width = 10,height =9)

布局函数:rArtifCluster

根据分组,人工指定布局

##-----人工置顶半径大小和圆心位置
#--这里我设置r都是相同的,也可以设置不同,然后包装成一个向量就可以了#-------
art = netClu
art$group = 1:5

xs = as.data.frame(table(art$group))
r = rep(15,length(xs$Freq))
r
#----准备圆心坐标,往往与你的设计有关#---------
# 有多少个模块就提供多少个坐标
#--指定坐标吮顺序按照一下指定
#-------人工准备坐标
ax1 = c(120,0)
ax2 = c(130,-30)
ax3 = c(140,-70)
ax4 = c(130,-110)
ax5 = c(120,-140)
da = rbind(ax1,ax2,ax3,ax4,ax5)
#--------计算布局#---------
#-------计算网络布局-得到节点坐标=node#---------
result2 = ArtifCluster(cor = cor,nodeGroup =art,r = r,da =da)
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)
# ---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


library(gganatogram)
library(viridis)


organism  = "solanum_lycopersicum.whole_plant"

data  =other_key[organism](/taowenmicro/ggClusterNet/wiki/organism)
library(scales)
show_col(data$colour)
data$colour  =c("#4DAF4A")
# data$colour[1] = ""
# , sex='female', fill="colour"
p = gganatogram(data=data, organism=organism,ggplot2_only = TRUE,fillOutline='#a6bddb',fill = "colour")  +
  # theme_void() +
  ggtitle(organism) + 
  theme(plot.title = element_text(hjust=0.5, size=9))  


p

p1 <- p + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum,size = mean),pch = 21, data = nodes) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1

#--------按照每个部分添加一个箭头
da2 = data.frame(x = da[,1] -50,y = da[,2])
da = as.data.frame(da)
colnames(da) = c("x0","y0")
da3 = cbind(da2,da)
da3
p2 = p1 + geom_segment(aes(x = x, y = y, xend = x0, yend = y0),data = da3,arrow = arrow(length = unit(0.2,"cm")),size = 0.7)
p2


ggsave("9.pdf",p2,width = 12,height = 11)

布局函数:model_Gephi.2

  • method :使用的模块化聚类算法,对于生成的可视化布局具有重要影响
  • seed: 随机种子设置,会影响最终布局

result2 <- model_Gephi.2(cor = cor,
                         method = "cluster_fast_greedy",
                         seed = 12
                         )
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)
#---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)


p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                                data = edge, size = 0.5,alpha = 0.6) +
  geom_point(aes(X1, X2,fill = Phylum,size = mean),pch = 21, data = nodes) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1


ggsave("10.pdf",p1,width = 12,height = 11)

model_maptree 布局


result2 <- model_maptree(cor = cor,
                         method = "cluster_fast_greedy",
                         seed = 12
                         )
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)
#---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)

p1 <- ggplot() +
  geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                              data = edge, size = 0.5,alpha = 0.6) +
  # geom_curve(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
  #            data = edge, size = 0.5,alpha = 0.3,curvature = -0.2) +
  geom_point(aes(X1, X2,fill = Phylum,size = mean),pch = 21, data = nodes) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1

ggsave("./11.pdf",p1,width = 12,height = 12)

大网络及其可视化算法应用


library(igraph)
library(dplyr)
library(Hmisc)


p.threshold = 0.05
r.threshold = 0.7
  x = ps %>% 
    # scale_micro(method = "TMM") %>%
    vegan_otu() %>% 
    t() %>%
    as.data.frame()
  occor<-WGCNA::corAndPvalue(t(x)/colSums(x),method = 'pearson')
  mtadj<-multtest::mt.rawp2adjp(unlist(occor$p),proc='BH')
  adpcor<-mtadj$adjp[order(mtadj$index),2]
  occor.p<-matrix(adpcor,dim(t(x)/colSums(x))[2])
  ## R value
  occor.r<-occor$cor
  diag(occor.r) <- 0
  
  # occor.r[occor.p > 0.05|abs(occor.r)<0.4] = 0
  
  occor.r[occor.p > p.threshold | abs(occor.r)< r.threshold] = 0
  occor.r[is.na(occor.r)]=0
  cor = occor.r

result= cor_Big_micro(ps = ps,N = 0,p.threshold = 0.05,r.threshold = 0.6,scale = FALSE)

cor = result[1](/taowenmicro/ggClusterNet/wiki/1)

大网络布局函数:model_igraph

p.threshold = 0.05
r.threshold = 0.6
  x = ps %>% 
    # scale_micro(method = "TMM") %>%
    vegan_otu() %>% 
    t() %>%
    as.data.frame()
  occor<-WGCNA::corAndPvalue(t(x)/colSums(x),method = 'pearson')
  mtadj<-multtest::mt.rawp2adjp(unlist(occor$p),proc='BH')
  adpcor<-mtadj$adjp[order(mtadj$index),2]
  occor.p<-matrix(adpcor,dim(t(x)/colSums(x))[2])
  ## R value
  occor.r<-occor$cor
  diag(occor.r) <- 0
  
  # occor.r[occor.p > 0.05|abs(occor.r)<0.4] = 0
  
  occor.r[occor.p > p.threshold | abs(occor.r)< r.threshold] = 0
  occor.r[is.na(occor.r)]=0
  cor = occor.r


result2 <- model_igraph(cor = cor,
                         method = "cluster_fast_greedy",
                         seed = 12
)
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)


dat = result2[2](/taowenmicro/ggClusterNet/wiki/2)
head(dat)
tem = data.frame(mod = dat$model,col = dat$color) %>%  dplyr::distinct( mod, .keep_all = TRUE)  
col = tem$col
names(col) = tem$mod

#---node节点注释#-----------
otu_table = as.data.frame(t(vegan_otu(ps)))
tax_table = as.data.frame(vegan_tax(ps))
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)

tem2 = dat %>% 
  dplyr::select(OTU,model,color) %>%
  dplyr::right_join(edge,by =c("OTU" = "OTU_1" ) ) %>%
  dplyr::rename(OTU_1 = OTU,model1 = model,color1 = color)
head(tem2)

tem3 = dat %>% 
  dplyr::select(OTU,model,color) %>%
  dplyr::right_join(edge,by =c("OTU" = "OTU_2" ) ) %>%
  dplyr::rename(OTU_2 = OTU,model2 = model,color2 = color)
head(tem3)

tem4 = tem2 %>%inner_join(tem3)
head(tem4)

edge2 = tem4 %>% mutate(color = ifelse(model1 == model2,as.character(model1),"across"),
                        manual = ifelse(model1 == model2,as.character(color1),"#C1C1C1")
                        )
head(edge2)
col_edge = edge2 %>% dplyr::distinct(color, .keep_all = TRUE)  %>% 
  select(color,manual)
col0 = col_edge$manual
names(col0) = col_edge$color

library(ggnewscale)

p1 <- ggplot() + geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = color),
                              data = edge2, size = 1) +
  scale_colour_manual(values = col0) 

ggsave("./cs1.pdf",p1,width = 16,height = 14)
p2 = p1 +
   new_scale_color() +
  geom_point(aes(X1, X2,color =model), data = dat,size = 4) +
  scale_colour_manual(values = col) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())

ggsave("./cs2.pdf",p2,width = 16,height = 14)
# plot(igraph,layout=sub_net_layout,vertex.size=2)
# p = ggplot(dat) +
#     geom_point(aes(X1, X2,fill = model),pch = 21)  
# p
#   
  

大网络布局函数:model_igraph

p.threshold = 0.05
r.threshold = 0.82
  x = ps %>% 
    # scale_micro(method = "TMM") %>%
    vegan_otu() %>% 
    t() %>%
    as.data.frame()
  occor<-WGCNA::corAndPvalue(t(x)/colSums(x),method = 'pearson')
  mtadj<-multtest::mt.rawp2adjp(unlist(occor$p),proc='BH')
  adpcor<-mtadj$adjp[order(mtadj$index),2]
  occor.p<-matrix(adpcor,dim(t(x)/colSums(x))[2])
  ## R value
  occor.r<-occor$cor
  diag(occor.r) <- 0
  
  # occor.r[occor.p > 0.05|abs(occor.r)<0.4] = 0
  
  occor.r[occor.p > p.threshold | abs(occor.r)< r.threshold] = 0
  occor.r[is.na(occor.r)]=0
  cor = occor.r

result2 <- model_maptree(cor = cor,
                         method = "cluster_fast_greedy",
                         seed = 12
)
node = result2[1](/taowenmicro/ggClusterNet/wiki/1)
head(node)

#---node节点注释#-----------
nodes = nodeadd(plotcord =node,otu_table = otu_table,tax_table = tax_table)
head(nodes)
#-----计算边#--------
edge = edgeBuild(cor = cor,node = node)
colnames(edge)[8] = "cor"
head(edge)

p1 <- ggplot() +
  geom_segment(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
                              data = edge, size = 0.5,alpha = 0.6) +
  # geom_curve(aes(x = X1, y = Y1, xend = X2, yend = Y2,color = cor),
  #            data = edge, size = 0.5,alpha = 0.3,curvature = -0.2) +
  geom_point(aes(X1, X2,fill = Phylum,size = mean),pch = 21, data = nodes) +
  # geom_text_repel(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  # geom_text(aes(X1, X2,label = elements),pch = 21, data = nodes) +
  scale_colour_manual(values = c("#377EB8","#E41A1C")) +
  scale_size(range = c(4, 14)) +
  scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) +
  theme(panel.background = element_blank()) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
  theme(legend.background = element_rect(colour = NA)) +
  theme(panel.background = element_rect(fill = "white",  colour = NA)) +
  theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank())
p1

ggsave("./cs3.pdf",p1,width = 26,height = 25)
# plot(igraph,layout=sub_net_layout,vertex.size=2)
# p = ggplot(dat) +
#     geom_point(aes(X1, X2,fill = model),pch = 21)  
# p
#