R语言生信图表学习之网络图
网络图可以展示不同变量之间的关系,包含的信息量也很大,在生信文章中非常常见。目前画网络图比较常用的还是cytoscape软件,这个软件非常强大,可以画出很多复杂精美的网络图。但是R语言也有很多可以画网络图的R包,今天就来学习一下。
这次学习的图是2020年发表于Molecular Cancer(IF 27)上的一篇m6A
的经典纯生信文章中的Fig2A
:
这篇文章的很多图都值得学习,前面还学习过其中的Fig1C
和Fig1E
,详情请戳:
正文开始
在学习一幅图怎么画之前首先了解这幅图主要包括哪些元素。
这幅网络图主要就是点和线,其中点的颜色和大小都要设置不同的属性,线的颜色也要设置不同的属性,另外,这幅图中的点有2层,其中一层只有颜色的不同!这种图层叠加的理念和ggplot2
不谋而合!我们只要先画大的点,再叠加1层小的点上去,就可以实现两层点了。
画图
本次用到的R包主要有
ggplot2
、tidygraph
、ggraph
。
首先是准备R包和数据:
rm(list = ls())
library(tidygraph)
library(ggplot2)
library(ggraph)
大佬曾说过:数就是图,图就是数,需要画什么样的图,就要提前准备好什么样的数据!
先自己造一个数据,至于为什么要像我这样造数据,我下面解释。
nodes <- data.frame(
point = paste0('point',1:21),
logrankP = sample(c(0.1,0.05,0.01,0.001), 21, replace = T),
cluster = sample(letters[1:5],21, replace = T),
factors = sample(c('Risk factors','Favorable factors'),21, replace = T)
)
edges <- data.frame(
from = sample(paste0('point',1:21),80,replace = T),
to = sample(paste0('point',1:21),80,replace = T),
correlation = sample(c('Positive','Negative'),80,replace = T),
width = sample(c(0.1,0.05,0.01,0.001), 80, replace = T)
)
tidygraph
和ggraph
是R语言画网络图的超级好用的R包,光看名字也能看出来,这是支持tidy
风格的R包。这两个R包对数据有些要求。
画网络图时无非就是对点和线添加不同的属性,比如:把某一个变量映射为点的大小,另一列映射为点的颜色,把某列映射为线条的粗细等。
所以在准备数据时,和点有关的属性要放在一个数据框里,和线有关的属性要放在另一个数据框里。比如上面我造的数据中,nodes
里面logrankP
我想映射为点的大小,cluster
是点的颜色,edges
里面from
和to
两列是必须的,指定网络关系,correlation
是映射为线的颜色,width
是映射为线的粗细。
开始画图
graph <- tbl_graph(nodes = nodes, edges = edges, directed = F) # 转换为合适的类型
# 使用ggraph画图
ggraph(graph, layout = 'linear', circular = T) +
geom_edge_fan(aes(color = correlation, width = width),strength=3) + # 画线,添加属性
scale_edge_width(range = c(1,2)) + # 设置线的粗细
scale_edge_color_manual(values = c('#C9DBED','#FFA2A4')) + # 改变颜色
geom_node_point(aes(size = logrankP,fill=cluster),shape=21) + # 画点,添加属性
scale_fill_manual(values = c('#3A76A9','#D13021','#FDBF7B','#804B23','#81D8DD')) + # 改变颜色
scale_size(range = c(8,18)) + # 设置点的大小
geom_node_point(aes(color=factors),size=5) + # 再叠加一层点!
theme_graph() # 改变主题
这样一幅简单的网络图就画好了!还可以通过ggplot2
的语法继续修改,达到更加美观的程度。
2个小问题
这幅图还有2个问题,在原图中,仔细观察可以发现线条是有粗细的,但是图例中并没有说明线条粗细是由哪个变量决定的,我在这里是使用了width
这一列映射的,但是还没找到方法不显示width
这个图例。
还有就是,叠加的第2层点,颜色没办法自定义。
欢迎有知道解决方法的小伙伴在评论区留言!
欢迎大家关注我的公众号:医学和生信笔记
医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!