一般而言我们展示层级结构使用的是进化树。相关工具有很多,例如MEGAN,ggtree,iTOL,Graphlan等,这次要刷新认识了,
Maptree;
Maptree的中文介绍似乎不多,基于R语言绘制相关图表资料较少。最近science的图表中第一幅主图使用Maptree展示,让我们惊艳到了。
Science:病原菌激活植物内生菌群的抑病功能
。通过宏基因组提取16S rRNA基因序列注释细菌群落并统计不同门类细菌差异,最大的圈代表门水平,逐渐缩小的圈按照梯度分别代表纲,科,属。不同颜色标记处差异的微生物。相比于我们graphlan别有一番趣味。这里带大家一起探索这个图表的奥秘。
Maptree
圆形填充表示层次结构:最大的圆圈(层次结构的起点)包含几个大圆圈(级别1),其中包含较小的圆圈(级别2),依此类推。等等。最后一个级别称为叶。
输入数据是节点之间的边的数据框和节点的数据框文件。边文件有两列,这两列的每一行有一个包含关系。如果A被B包含,B被C包含,那么C包含A。这样的一对数字则构成了我们做Maptree的原始输入。
-
边文件格式要求
-
节点文件即为全部节点即可。
通过一个简单的实例我们来进行一个基本了解
有关ggraph包我们在志气啊已经进行过介绍:参见。igraph包作为最大牌的网络图工具值得大家进行学习,具体参见.
通过vertices参数指定节点的属性,这里通过增加vertices列的数量来添加任何属性,包括需要映射的颜色,形状,大小等等。
# 载入包
library(ggraph)
library(igraph)
library(tidyverse)
# 提取边文件
edges
# 提取节点文件
vertices
# 构建igraph对象
mygraph
# 出图
ggraph(mygraph, layout = 'circlepack') +
geom_node_circle() +
theme_void()
布局转化
这一图形同一下图形之间是可以轻松转化的,只需要修改layout参数。
ggraph(mygraph, layout='dendrogram', circular=TRUE) +
geom_edge_diagonal() +
theme_void() +
theme(legend.position="none")
类似树图的展示
这种方式展示树图让让不同分支产生了流动的效果。
ggraph(mygraph, layout='dendrogram', circular=FALSE) +
geom_edge_diagonal() +
theme_void() +
theme(legend.position="none")
将圈树化为水平展示
设置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")
使用igeaph网络布局展示
ggraph(mygraph) +
geom_edge_link() +
geom_node_point() +
theme_void() +
theme(legend.position="none")
配色和标签设置
# 载入包
library(tidyverse)
library(viridis)
# 同样导入边和节点数据
edges=flare$edges
vertices = flare$vertices
str(edges)
head(edges)
##构造网络对象
mygraph 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")
添加标签
geom_node_text用于添加标签,使用方法和geom_text类似。
# 重现导入边和节点数据,方便重复
edges %
filter(to %in% from) %>%
droplevels()
vertices %
filter(name %in% c(edges$from, edges$to)) %>%
droplevels()
vertices$size
# 构造对象
mygraph _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()
如需联系EasyCharts团队
请加微信:
EasyCharts