够用就好的网络分析_03.R语言网络分析实战练习(以PPI为例)
❝如下碎碎念:年末了,实在是忙。
回顾一下这个月的公众号的推文,比较前几个月,冷清了很多。
11月份,我必把够用就好的网络分析彻底终结。
12月份,开启广大粉丝一直期待的ggplot2
版本的WGCNA
!
❝在这一系列够用就好的网络分析推文中,我们主要涉及到以下内容
01.网络分析及其在生物信息学中的应用 02.网络分析常用软件及常用R包介绍 03.R语言网络分析实战练习 04.网络分析中的各种网络属性 05.网络分析可视化常用布局 06.网络分析可视化之自定义布局
03.R语言网络分析实战练习(以PPI为例)
❝在生物信息学中,我接触最多主要有两个方向:
网络分析紧密相关的有蛋白质相互作用 PPI (Protein-Protein Interaction)
微生物的共现网络 MCN (Microbial Co-occurrence Network)
。
从上一期推文中可知igraph
是我们使用R&Python
进行网络分析的基石。
今天笔者简单的介绍一下本人常接触的PPI
和MCN
分析,
了解网络分析涉及到的输入数据的格式,快速且简单的构建一个网络。
后续我们再一起探索网络的各种网络属性。
❝针对
PPI
, 那么我就不得不提及的就是大名鼎鼎的STRING
数据库。
❝这里,我们不去介绍
STRING
的用法(具体用法,大家请自行百度)。 然后我们开始输入human
的Symbol ID
然后进行预测。
❝我们的测试数据为
200
个human
的Symbol ID
然后下载PPI
的结果
❝拿到这个数据之后,我们就可以开始进行
PPI
的分析以及可视化。
rm(list = ls())
####----load R Package----####
library(tidyverse)
library(readxl)
library(igraph)
####----load Data----####
ppi_df <- read_delim(file = "Input/string_interactions_short.tsv",
col_names = T,
delim = "\t") %>%
dplyr::select(1,2,13) %>%
purrr::set_names(c("from","to","weight"))
head(ppi_df)
# A tibble: 6 × 3
from to weight
<chr> <chr> <dbl>
1 ABCG1 APOA1 0.997
2 ABCG1 CH25H 0.469
3 ABHD16A IFITM3 0.58
4 ACOD1 IFNG 0.477
5 ACOD1 IRF1 0.429
6 ACOD1 CXCL10 0.695
❝因此,在进行
PPI
分析的时候,我们只需要最基础的三列数据,分别是from
、to
和weight
。 既可以构建成为网络对象。
# 基于data.frame,创建网络对象
# 构建有向网络图
igraph_obj1 <- igraph::graph_from_data_frame(ppi_df, directed = T)
igraph_obj1
IGRAPH f825884 DNW- 129 1355 --
+ attr: name (v/c), weight (e/n)
+ edges from f825884 (vertex names):
[1] ABCG1 ->APOA1 ABCG1 ->CH25H ABHD16A->IFITM3 ACOD1 ->IFNG
[5] ACOD1 ->IRF1 ACOD1 ->CXCL10 ACOD1 ->GBP5 ACOD1 ->IFIT3
[9] ACOD1 ->MTHFR ACOD1 ->ISG15 ACOD1 ->RSAD2 ACOD1 ->IRF7
[13] ADAR ->USP18 ADAR ->OAS3 ADAR ->IRF1 ADAR ->DHX58
[17] ADAR ->BST2 ADAR ->CMPK2 ADAR ->OASL ADAR ->SP110
[21] ADAR ->RTP4 ADAR ->PARP12 ADAR ->UBE2L6 ADAR ->DTX3L
[25] ADAR ->STAT2 ADAR ->TRIM25 ADAR ->OAS2 ADAR ->TAP1
[29] ADAR ->PARP9 ADAR ->STAT1 ADAR ->IFITM3 ADAR ->PARP14
+ ... omitted several edges
# 查看数据类型
class(igraph_obj1)
# [1] "igraph"
# 构建无向网络
igraph_obj2 <- igraph::graph_from_data_frame(ppi_df, directed = F)
igraph_obj2
IGRAPH 7f65c2d UNW- 129 1355 --
+ attr: name (v/c), weight (e/n)
+ edges from 7f65c2d (vertex names):
[1] ABCG1 --APOA1 ABCG1 --CH25H ABHD16A--IFITM3 ACOD1 --IFNG
[5] ACOD1 --IRF1 ACOD1 --CXCL10 ACOD1 --GBP5 ACOD1 --IFIT3
[9] ACOD1 --MTHFR ACOD1 --ISG15 ACOD1 --RSAD2 ACOD1 --IRF7
[13] ADAR --USP18 ADAR --OAS3 ADAR --IRF1 ADAR --DHX58
[17] ADAR --BST2 ADAR --CMPK2 ADAR --OASL ADAR --SP110
[21] ADAR --RTP4 ADAR --PARP12 ADAR --UBE2L6 ADAR --DTX3L
[25] ADAR --STAT2 ADAR --TRIM25 ADAR --OAS2 ADAR --TAP1
[29] ADAR --PARP9 ADAR --STAT1 ADAR --IFITM3 ADAR --PARP14
+ ... omitted several edges
❝我们对
igraph
对象进行一个仔细的理解。
igraph_obj1
IGRAPH f825884 DNW- 129 1355 --
+ attr: name (v/c), weight (e/n)
+ edges from f825884 (vertex names):
[1] ABCG1 ->APOA1 ABCG1 ->CH25H ABHD16A->IFITM3 ACOD1 ->IFNG
[5] ACOD1 ->IRF1 ACOD1 ->CXCL10 ACOD1 ->GBP5 ACOD1 ->IFIT3
[9] ACOD1 ->MTHFR ACOD1 ->ISG15 ACOD1 ->RSAD2 ACOD1 ->IRF7
[13] ADAR ->USP18 ADAR ->OAS3 ADAR ->IRF1 ADAR ->DHX58
[17] ADAR ->BST2 ADAR ->CMPK2 ADAR ->OASL ADAR ->SP110
[21] ADAR ->RTP4 ADAR ->PARP12 ADAR ->UBE2L6 ADAR ->DTX3L
[25] ADAR ->STAT2 ADAR ->TRIM25 ADAR ->OAS2 ADAR ->TAP1
[29] ADAR ->PARP9 ADAR ->STAT1 ADAR ->IFITM3 ADAR ->PARP14
+ ... omitted several edges
第一行表示这是一个 IGRAPH
对象,后续跟着的是一个变量的编号,其实没有什么含义f825884
。再往后面 4 个字符分别具有重要意义: 第一个字符被分配一个 D
或一个U
,指示igraph
对象是有向的directed
还是无向undirected
的。第二个字母是 N
或破折号(-
),指示igraph
对象是否具有name
属性。第三个字母是 W
或破折号(-
),其边是否具有权重的属性。最后,第四个字符可以是 -
或者C
,表示简单的图或者复杂的图。后面的 129
是节点vertices
的个数,1355
是边edge
的个数。+attr
标签后面的括号可以采用以下三个值之一:g
表示图形graph
,v
表示顶点vertices
,e
表示边edges
。 同时引用R
中的数据类型:n
表示数字numeric
,c
表示字符character
,l
表示逻辑logical
。
# igraph中有函数,可以直接查看igraph的节点
V(igraph_obj1)
+ 129/129 vertices, named, from f825884:
[1] ABCG1 ABHD16A ACOD1 ADAR APOA1 APOA4 APOD
[8] APOL6 BATF2 BST2 C4B CALCA CALHM6 CCL7
[15] CD180 CD274 CFB CH25H CIITA CMPK2 CXCL10
[22] DDX58 DHX58 DTX3L ENPP2 ENY2 FCER1G FCGR1A
[29] GBP2 GBP3 GBP4 GBP5 GBP6 GBP7 GNS
[36] GRN GYPA GZMA HCLS1 HK3 IDO1 IFI35
[43] IFI44 IFIT3 IFITM3 IFNG IL10RA IL15RA IL18BP
[50] IL2RG IRAK2 IRF1 IRF7 IRF9 IRGM ISG15
[57] KIF5C LAP3 LCP2 LGALS3BP LGALS9 LY6E MX1
[64] NOD1 OAS2 OAS3 OASL PARP10 PARP12 PARP14
+ ... omitted several vertices
# 查看边的情况
E(igraph_obj1)
+ 1355/1355 edges from f825884 (vertex names):
[1] ABCG1 ->APOA1 ABCG1 ->CH25H ABHD16A->IFITM3 ACOD1 ->IFNG
[5] ACOD1 ->IRF1 ACOD1 ->CXCL10 ACOD1 ->GBP5 ACOD1 ->IFIT3
[9] ACOD1 ->MTHFR ACOD1 ->ISG15 ACOD1 ->RSAD2 ACOD1 ->IRF7
[13] ADAR ->USP18 ADAR ->OAS3 ADAR ->IRF1 ADAR ->DHX58
[17] ADAR ->BST2 ADAR ->CMPK2 ADAR ->OASL ADAR ->SP110
[21] ADAR ->RTP4 ADAR ->PARP12 ADAR ->UBE2L6 ADAR ->DTX3L
[25] ADAR ->STAT2 ADAR ->TRIM25 ADAR ->OAS2 ADAR ->TAP1
[29] ADAR ->PARP9 ADAR ->STAT1 ADAR ->IFITM3 ADAR ->PARP14
[33] ADAR ->IFI35 ADAR ->IFI44 ADAR ->RSAD2 ADAR ->ZNFX1
[37] ADAR ->IFIT3 ADAR ->ISG15 ADAR ->IRF7 ADAR ->MX1
+ ... omitted several edges
我们也可以简单的对igraph
对象进行可视化
plot(igraph_obj1)
我们对数据进行一些布局的改变,我们先看看igraph
中有哪些布局
layouts <- grep("^layout_", ls("package:igraph"), value=TRUE)[-1]
layouts
[1] "layout_as_bipartite" "layout_as_star" "layout_as_tree"
[4] "layout_components" "layout_in_circle" "layout_nicely"
[7] "layout_on_grid" "layout_on_sphere" "layout_randomly"
[10] "layout_with_dh" "layout_with_drl" "layout_with_fr"
[13] "layout_with_gem" "layout_with_graphopt" "layout_with_kk"
[16] "layout_with_lgl" "layout_with_mds" "layout_with_sugiyama"
plot(igraph_obj1,
layout = layout_randomly,
vertex.label = NA)
plot(igraph_obj1,
layout = layout_in_circle,
vertex.label = NA)
plot(igraph_obj1,
layout = layout_on_sphere,
vertex.label = NA)
plot(igraph_obj1,
layout = layout_with_fr,
vertex.label = NA)
plot(igraph_obj1,
layout = layout_with_kk,
vertex.label = NA)
plot(igraph_obj1,
layout = layout_with_lgl,
vertex.label = NA)
plot(igraph_obj1,
layout = layout_as_star,
vertex.label = NA)
layouts <- layouts[!grepl("bipartite|merge|norm|sugiyama|tree", layouts)]
layouts
[1] "layout_as_star" "layout_components" "layout_in_circle"
[4] "layout_nicely" "layout_on_grid" "layout_on_sphere"
[7] "layout_randomly" "layout_with_dh" "layout_with_drl"
[10] "layout_with_fr" "layout_with_gem" "layout_with_graphopt"
[13] "layout_with_kk" "layout_with_lgl" "layout_with_mds"
pdf(file = "Output/layout.pdf",
height = 9,
width = 4)
par(mfrow = c(5,3), mar = c(1,1,1,1))
for (layout in layouts) {
print(layout)
l <- do.call(layout, list(igraph_obj1))
plot(igraph_obj1,
edge.arrow.mode = 0,
layout = l,
vertex.label = NA,
main = layout)
}
dev.off()
RPython公众号网络可视化预览
❝笔者之前绘制过诸多的网络可视化,都是基于以上关键
R
包进行绘制的。
推文链接如下:
❝注意:里面的龙凤呈祥的感觉其实就是网络可视化实现的。
推文链接如下:
❝复现了文章中的物种注释图
推文链接如下:
❝自定义的网络布局
推文链接如下:
❝
PPI
互作网络
推文链接如下:
❝不一样的GO注释
❝剩下电脑里面就是笔者的小论文和大论文了,这里就不给大家展示了,hhhhhhh。
历史绘图合集
公众号推文一览
进化树合集
环状图
散点图
基因家族合集
换一个排布方式:
首先查看基础版热图:
然后再看进阶版热图:
基因组共线性
WGCNA ggplot2版本
其他科研绘图
合作、联系和交流
有很多小伙伴在后台私信作者,非常抱歉,我经常看不到导致错过,请添加下面的微信联系作者,一起交流数据分析和可视化。