微生物共现网络可视化实现布局自由
ggraph包常用于网络数据可视化,其语法特征与ggplot2相同,我们很容易将ggplot2的知识扩展到ggraph上。ggraph的绘图思路大致如下:
- 计算网络(
graph
)的布局,获得节点(vertex
)在X-Y轴上的坐标值,返回布局数据框layout_df
; - 利用1中返回的数据框
layout_df
,利用ggraph(layout_df)
函数绘制画布; - 添加图形元素,即节点(
vertex
)和边(edge
)。
在计算网络布局中,可以使用已经有的算法计算布局,例如"fr", "cycle", "stress"
等,但有时我们希望能根据自身数据的需要进行布局,那么我们就可以使用 layout_df <- create_layout(graph_test,layout="manual",x=x,y=y)
计算出网络文件graph_test
的布局数据框layout_df
,然后像在ggplot2
中绘图一样绘制网络图即可。
layout_df <- create_layout(graph_test,layout="manual",x=x,y=y)
ggraph(layout_df)
geom_edge_link()
geom_node_point()
重点就是:如何根据自身需要计算出节点(vertex
)在X-Y轴上的坐标值x
和y
。
譬如,我利用stress
布局获得了如下结果:
但我还是觉得有些混乱,我想将同一门内的微生物放在一块进行可视化,如下图:
此时,我们可以根据自身的需要,巧妙地计算各个节点对应的X-Y值,然后自定义布局即可。虽然我们是自定义布局,但我们也没有必要从轮子造起,灵活运用已有的布局算法实现我们的想法,思路如下:
- 根据节点的分类信息属性将网络分解为若干个子网络,即
Proteobactria network
,Acidobacteria network
等; - 对各个子网络利用
sphere
算法计算网络布局 - 对获得的布局坐标进行圆形偏移,即获得自定义布局的XY坐标
- 根据
xy
值自定义网络布局
实战代码
下面我们以按模块分类为例,给出其大致的思路及具体的R代码。
- 总体思路:
- 对微生物共现网络的模块进行划分;
- 按照模块大小排序,对前面的模块进行着色,其余归为其它;
- 对各模块进行圆形布局,求解布局坐标.
- R代码:
library(magrittr)
library(igraph)
library(ggraph)
library(purrr)
g1 <- read_graph("~/Desktop/graph_test.graphml",format = "graphml")
wtc <- cluster_louvain(g1,NA)
modularity(wtc)
m<-membership(wtc)
sorted_table_m <- sort(table(m),decreasing = TRUE)
top <- 1:5
df1 <- data.frame(old=names(sorted_table_m),new=c(top,rep("other",length(sorted_table_m)-length(top))))
new_m <- unlist(map(m,function(x) df1[df1$old%in%x,2]))
groupVector <- function(x){
lev <- levels(as.factor(x))
len <- length(lev)
list1 <- vector("list", len)
for(i in 1:len){
list1[[i]] <- names(x)[x == lev[i]]
names(list1)[i] <- lev[i]
}
return(list1)
}
gv <- groupVector(new_m)
g_list <- map(gv,~induced_subgraph(g1,.x))
ly3 <- map(g_list,function(x) create_layout(x,layout = "sphere"))
x <- ly3 %>% map(~.$x)
y <- ly3 %>% map(~.$y)
theta <- seq(0,2*pi,2*pi/(length(g_list)))
mx <- 4*cos(theta[-1])
my <- 4*sin(theta[-1])
mxx <- unlist(map2(x,mx,function(x,y) x y))
myy <- unlist(map2(y,my,function(x,y) x y))
name <- unlist(ly3 %>% map(~.$name))
df2 <- data.frame(x=mxx,y=myy,row.names = name)
ly4 <- create_layout(g1,layout = "manual",x=df2[V(g1)$name,1],y=df2[V(g1)$name,2])
edgeColor <- ifelse(E(g1)$weight_1>0,"positive","negative")
colorfactor <- factor(new_m[ly4$name])
mycolor <- c("blue","red","orange","turquoise4","purple","gray")
ggv4 <- ggraph(ly4)
geom_edge_link(aes(colour=as.factor(edgeColor)),edge_width=0.1,alpha=0.3)
geom_node_point(aes(color=colorfactor))
theme_minimal()
scale_edge_color_manual(values = c("green4","red"),name="Correlation")
scale_color_manual(values = mycolor,name="Modular")
theme(axis.title = element_blank(),
axis.ticks = element_blank(),
axis.line = element_blank(),
axis.text = element_blank(),
panel.grid = element_blank())
ggv4
pdf("~/Desktop/graph visualization by modular.pdf",width = 10,height = 7)
ggv4
dev.off()
- 实现效果
测试数据可查看:
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggjgkh
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13