查看原文
其他

Maptree-层级结构数据展示的绝佳尝试

文涛聊科研 微生信生物 2022-07-05


一般而言我们展示层级结构使用的是进化树。相关工具有很多,例如MEGAN,ggtree,iTOL,Graphlan等,这次要刷新认识了,Maptree;Maptree的中文介绍似乎不多,基于R语言绘制相关图表资料较少。最近science的图表中第一幅主图使用Maptree展示,让我们惊艳到了。Science:病原菌激活植物内生菌群的抑病功能。通过宏基因组提取16S rRNA基因序列注释细菌群落并统计不同门类细菌差异,最大的圈代表门水平,逐渐缩小的圈按照梯度分别代表纲、科、属。不同颜色标记处差异的微生物。相比于我们graphlan别有一番趣味。这里带大家一起探索这个图表的奥秘。


1

Maptree


圆形填充表示层次结构:最大的圆圈(层次结构的起点)包含几个大圆圈(级别1),其中包含较小的圆圈(级别2),依此类推。等等。最后一个级别称为叶。
输入数据是节点之间的边的数据框和节点的数据框文件。边文件有两列,这两列的每一行有一个包含关系。如果A被B包含,B被C包含,那么C包含A。这样的一对数字则构成了我们做Maptree的原始输入。
  • 边文件格式要求 

  • 节点文件即为全部节点即可。


2

通过一个简单的实例我们来进行一个基本了解


有关ggraph包我们在志气啊已经进行过介绍:参见。igraph包作为最大牌的网络图工具值得大家进行学习,具体参见.
通过vertices参数指定节点的属性,这里通过增加vertices列的数量来添加任何属性,包括需要映射的颜色,形状,大小等等。
# 载入包
library(ggraph)
library(igraph)
library(tidyverse)

# 提取边文件
edges <- flare$edges

# 提取节点文件
vertices <- flare$vertices

# 构建igraph对象
mygraph <- graph_from_data_frame( edges, vertices=vertices )

# 出图
ggraph(mygraph, layout = 'circlepack') +
geom_node_circle() +
theme_void()


3

布局转化


这一图形同一下图形之间是可以轻松转化的,只需要修改layout参数。
ggraph(mygraph, layout='dendrogram', circular=TRUE) +
geom_edge_diagonal() +
theme_void() +
theme(legend.position="none")


4

类似树图的展示


这种方式展示树图让让不同分支产生了流动的效果。
ggraph(mygraph, layout='dendrogram', circular=FALSE) +
geom_edge_diagonal() +
theme_void() +
theme(legend.position="none")


5

将圈树转化为水平展示


设置circular=T参数,默认设置。
ggraph(mygraph, 'treemap', weight = 'size') +
geom_node_tile(aes(fill = depth), size = 0.25) +
theme_void() +
theme(legend.position="none")

ggraph(mygraph, 'partition', circular = TRUE) +
geom_node_arc_bar(aes(fill = depth), size = 0.25) +
theme_void() +
theme(legend.position="none")

6

使用igeaph网络布局展示


ggraph(mygraph) +
geom_edge_link() +
geom_node_point() +
theme_void() +
theme(legend.position="none")


7

配色和标签设置



# 载入包
library(tidyverse)
library(viridis)

# 同样导入边和节点数据
edges=flare$edges
vertices = flare$vertices
str(edges)
head(edges)
##构造网络对象
mygraph <- graph_from_data_frame( edges, vertices=vertices )

出图函数是ggraph,提供将igraph对象通过layout的定义转换为相应的ggplot坐标并输出数据框。这很重要,因为后面的geom都是基于这个数据框来出图的。出图函数geom_node_circle:同ggplot2中的geom对象一样的用法。不过这里的depth似乎不太好理解,因为这是转化后的自带列名。作用时将maptreee按照登记分为几个部分。填充上对应的数字。从0开始逐渐递增代表了层级越来越低。本次通过depth来对图形进行填充颜色。scale_fill_manual用于指定填充颜色,values指定颜色,这是一组向量,需要使用目标填充列对颜色进行署名,来指定对应的颜色。scale_color_manual来定义边框颜色,这里除了最外层,都被设置成黑色了。
# Hide the first level (right)
ggraph(mygraph, layout = 'circlepack', weight="size") +
geom_node_circle(aes(fill = as.factor(depth), color = as.factor(depth) )) +
scale_fill_manual(values=c("0" = "white", "1" = viridis(4)[1], "2" = viridis(4)[2], "3" = viridis(4)[3], "4"=viridis(4)[4])) +
scale_color_manual( values=c("0" = "white", "1" = "black", "2" = "black", "3" = "black", "4"="black") ) +
theme_void() +
theme(legend.position="FALSE")
# Second one: hide 2 first levels

更改配色我们就很轻易得到了下面的图形:

ggraph(mygraph, layout = 'circlepack', weight="size") +
geom_node_circle(aes(fill = as.factor(depth), color = as.factor(depth) )) +
scale_fill_manual(values=c("0" = "white", "1" = "white", "2" = magma(4)[2], "3" = magma(4)[3], "4"=magma(4)[4])) +
scale_color_manual( values=c("0" = "white", "1" = "white", "2" = "black", "3" = "black", "4"="black") ) +
theme_void() +
theme(legend.position="FALSE")


8

添加标签


geom_node_text用于添加标签,使用方法和geom_text类似。
# 重现导入边和节点数据,方便重复
edges <- flare$edges %>%
filter(to %in% from) %>%
droplevels()
vertices <- flare$vertices %>%
filter(name %in% c(edges$from, edges$to)) %>%
droplevels()
vertices$size <- runif(nrow(vertices))

# 构造对象
mygraph <- graph_from_data_frame( edges, vertices=vertices )

ggraph(mygraph, layout = 'circlepack', weight="size" ) +
geom_node_circle(aes(fill = depth)) +
geom_node_text( aes(label=shortName, filter=leaf, fill=depth, size=size)) +
theme_void() +
theme(legend.position="FALSE") +
scale_fill_viridis()




▼微生信生物
长按识别二维码关注我们,欢迎把我们推荐给你的朋友呦
长按识别二维码,备注“姓名-单位-研究方向”,添加小编微信,小编带你入伙啦(微生信生物讨论群),大牛如云,让交流变得简单!微生信生物

nanjingxuezi




reference

https://www.r-graph-gallery.com/313-basic-circle-packing-with-several-levels.html


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存