分享

R语言生信图表学习之网络图

 阿越就是我 2023-10-12 发布于上海

网络图可以展示不同变量之间的关系,包含的信息量也很大,在生信文章中非常常见。目前画网络图比较常用的还是cytoscape软件,这个软件非常强大,可以画出很多复杂精美的网络图。但是R语言也有很多可以画网络图的R包,今天就来学习一下。

这次学习的图是2020年发表于Molecular Cancer(IF 27)上的一篇m6A的经典纯生信文章中的Fig2A

image-20220108093228351

这篇文章的很多图都值得学习,前面还学习过其中的Fig1CFig1E,详情请戳:

使用R语言美化PCA图

R语言画dumbbell chart

image-20220108093335633
image-20220108093457315

正文开始

在学习一幅图怎么画之前首先了解这幅图主要包括哪些元素。

这幅网络图主要就是点和线,其中点的颜色和大小都要设置不同的属性,线的颜色也要设置不同的属性,另外,这幅图中的点有2层,其中一层只有颜色的不同!这种图层叠加的理念和ggplot2不谋而合!我们只要先画大的点,再叠加1层小的点上去,就可以实现两层点了。

画图

本次用到的R包主要有ggplot2tidygraphggraph

首先是准备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)
)

tidygraphggraph是R语言画网络图的超级好用的R包,光看名字也能看出来,这是支持tidy风格的R包。这两个R包对数据有些要求。

画网络图时无非就是对点和线添加不同的属性,比如:把某一个变量映射为点的大小,另一列映射为点的颜色,把某列映射为线条的粗细等。

所以在准备数据时,和点有关的属性要放在一个数据框里,和线有关的属性要放在另一个数据框里。比如上面我造的数据中,nodes里面logrankP我想映射为点的大小,cluster是点的颜色,edges里面fromto两列是必须的,指定网络关系,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() # 改变主题
image-20220108095846693

这样一幅简单的网络图就画好了!还可以通过ggplot2的语法继续修改,达到更加美观的程度。

2个小问题

这幅图还有2个问题,在原图中,仔细观察可以发现线条是有粗细的,但是图例中并没有说明线条粗细是由哪个变量决定的,我在这里是使用了width这一列映射的,但是还没找到方法不显示width这个图例。

还有就是,叠加的第2层点,颜色没办法自定义。

欢迎有知道解决方法的小伙伴在评论区留言!

欢迎大家关注我的公众号:医学和生信笔记

医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多