R  画网络图

目的:用R做生信分析,画基因样本的网络图,从中观察样本的致病性情况。

一、所用到的包

  1. library(tidyr)
  2. library(ggplot2)
  3. library(reshape2)
  4. library(readr)
  5. library(network)
  6. library(dplyr)
  7. library(plyr)
  8. library(sna)
  9. library(GGally)
  10. library(ggnetwork)
  11. library(tidygraph)# tidy graph analysis
  12. #library(tidyverse)# tidy data analysis
  13. library(ggraph)
  14. library(stringr)
  15. library(networkD3)
  16. library(igraph)
  17. library(visNetwork)
  18. library(threejs)
  19. library(ndtv)
  20. library(grid)
  21. library(Rmisc)
  22. #library(vioplot)
  23. library(tibble)

13行中:tidyverse包集成了很多画图的包:如下

tidyverse_packages(include_self = TRUE)

[1] "broom"       "cli"         "crayon"      "dplyr"       "dbplyr"      "forcats"     "ggplot2"     "haven"       "hms"         "httr"

[11] "jsonlite"    "lubridate"   "magrittr"    "modelr"      "purrr"       "readr"       "readxl\n(>=" "reprex"      "rlang"       "rstudioapi"

[21] "rvest"       "stringr"     "tibble"      "tidyr"       "xml2"        "tidyverse"

但是如果同时使用这些包,会提示tidyverse_conflicts(),使用tidyverse_conflicts()可以查看tidyverse和其他哪些包冲突:

> tidyverse_conflicts()

-- Conflicts ------------------------------------------ tidyverse_conflicts() --

x tidygraph::arrange()    masks dplyr::arrange(), plyr::arrange()

x tibble::as_data_frame() masks igraph::as_data_frame(), dplyr::as_data_frame()

x purrr::compact()        masks plyr::compact()

x purrr::compose()        masks igraph::compose()

x dplyr::count()          masks plyr::count()

x tidyr::crossing()       masks igraph::crossing()

x dplyr::failwith()       masks plyr::failwith()

x tidygraph::filter()     masks dplyr::filter(), stats::filter()

x igraph::groups()        masks tidygraph::groups(), dplyr::groups()

x dplyr::id()             masks plyr::id()

x dplyr::lag()            masks stats::lag()

x tidygraph::mutate()     masks dplyr::mutate(), plyr::mutate()

x tidygraph::rename()     masks dplyr::rename(), plyr::rename()

x purrr::simplify()       masks igraph::simplify()

x dplyr::summarise()      masks plyr::summarise()

x dplyr::summarize()      masks plyr::summarize()

所以我注释掉了tidyverse,需要用哪个包就自己添加。

二、画网络图遇到的问题

1.颜色自定义

我根据list中属性的种类来定义nodes的颜色,de[,5]中的值为“P”、“V”、“B”,三个类别。

常规的写法是:

geom_node_point(size = 3, alpha = 1,aes(color =de[,5]))

这样系统自动分陪颜色,红绿蓝给BPV,

但是会出现以下问题:

A) de[,5]中PVB 出现的顺序会影响到颜色的标记。

B) de[,5]中PVB并不是三种都出现,而是三种的随机组合出现,比如只有PV或者只有VB或者只有PB。

以上原因导致网络图中颜色不对应,第一幅图中红=B  绿=P  蓝=V,如果de[,5]中只有BV两种,会生成红=B,绿=V,导致图例和实际的PVB值不对应。

同时因为看的人肯能出现色盲的情况,一般不用红色和绿色来表示nodes的颜色,所以需要自定义颜色。

比如我需要自定义颜色:效果是这样

'V'='#b27390', 'P'='#f15941','B'='#42a3c6'

我用的ggraph这个画图函数,所以只需要加上scale_color_manual就行:

(如果使用的是ggplot,则用scale_fill_manual)。

这里需要注意scale_color_manua有两种写法:

1)scale_color_manual(name="diagnosis",labs=c(‘V’,’P’,’B’) values=c(''#b27390', '#f15941','#42a3c6'))

2)scale_color_manual(name="diagnosis", values=c('V'='#b27390', 'P'='#f15941','B'='#42a3c6'))

必选参数values:https://blog.csdn.net/songzhilian22/article/details/49388973

values,用于指定这个标度应该生成的值。如果这个向量中的元素是有名称的。则它将自动匹配输入和输出的值,否则它将按照离散型变量中水平的先后次序进行匹配。所以选择第2中方法给定义颜色,以免随机产生颜色。

最后的结果如下:

2.多样本for循环的使用问题

本数据中包含多个样本,在画图之前要对样本进行切割,使用split最好不过了。

split(data1, as.factor(data1$gene))#按照基因切割

split(gene, gene$sampleid)#按照样本切割

切割后添加过滤条件,一个样本至少携带两个variant的sample保留下来做网络图。行数≥2的说明只有两个variant,按照gene切割的安装代码如下,用到第一个for循环:

for (gene in data_per_gene) {

data_per_sample_per_gene <- split(gene, gene$sampleid)

########### Then we enumerate each sample to obtain the edges ###############

for (sample in data_per_sample_per_gene) {

######### we demand sample carry >=2 variants in the same gene to be considered #############

if ((nrow(sample)>=2)&&(sum(sample$GT)==2)){

####### create combinations of variants #################################

a <- combn(sample$num_id,2)

b <- data.frame(t(a))

b$sample <- as.character(unique(sample$sampleid))

b$gene <- as.character(unique(sample$gene))

edge <- rbind(edge, b)

}

}

}

然后对edge中的边所对应的gene切割

edge_per_gene <- split(edge, as.factor(edge$gene))

接下来我们为每个基因的每一个variant创建边:用到第二个for循环

for (gene in edge_per_gene)

这个循环里,我们不仅要完成边和点的连接,还要完成画图。

3.连接边和点

 

对edge中的X1,X2进行分组操作,然后计算边的权重。(不同的样本有相同的边也合并计算权重,值保留一条边,用权重weight表示边连接的次数)

edge2 <- gene %>%

group_by(X1, X2) %>%

summarise(weight = n()) %>%

ungroup()

unique(edge2)

然后定义nodes,选择X1和X2中唯一出现的num_id合并去重,

nodesX1 <- subset(nodes0, (nodes0$num_id %in%edge2$X1))

nodesX2 <- subset(nodes0, (nodes0$num_id %in%edge2$X2))

nodes2<-unique(rbind(nodesX1,nodesX2))

把nodes2的第一列单独拿出来:

nodes3<-as.data.frame(nodes2[,1])

接下来建立点和边的连接关系,我们把nodes3 重新编号命名,

nodes3$ID <- seq(1:nrow(nodes3))

colnames(nodes3) <- c("var","id")

nodes3$var <- as.integer(nodes3$var)

edges2中的边也通过id与nodes3建立连接:

edges <- edge2 %>%

left_join(nodes3, by = c(X1 = "var")) %>%

rename(from = id)

edges <- edges %>%

left_join(nodes3, by = c(X2 = "var")) %>%

rename(to = id)

最后,选择边的集合:

edges <- select(edges, from,to,weight)

4.画网络图

 

我们创建无向图,directed = FALSE。

我使用的library(network),网上还有library(networkD3),library(sna)等。

 

routes_network <- network(edges,

vertex.attr = nodes3,

matrix.type = "edgelist",

ignore.eval = FALSE)

routes_tidy <- tbl_graph(nodes = nodes3, edges = edges, directed = FALSE)

5.ggraph画图

画图之前,我们自定义点的名字nodename

de<- routes_tidy %>%

activate(nodes) %>%

as.data.frame()

de<-cbind(de,nodes2$color_net)

colnames(de) <- c("var","id","degree","centrality","diagnosis")

nodename<-paste(de$degree,"-",de$var)

最后使用ggraph画图:

ggraph(routes_tidy ,layout = "fr") +

geom_edge_link(aes(width = weight),alpha = 0.6) +

geom_node_point(size = 3, alpha = 1,aes(color =de[,5])) +

scale_color_manual(name="diagnosis", values=c('V'='#b27390', 'P'='#f15941','B'='#42a3c6'))+#分配颜色

geom_node_text(aes(label = nodename), size = 0.5, repel = FALSE) +

scale_edge_width(range = c(0.2, 2)) +

labs(x = "", y = "", title = filename) +

theme(axis.ticks = element_blank()) +

theme(axis.text.x = element_blank())+

theme(axis.text.y = element_blank())+

theme(panel.grid=element_blank())+

theme(panel.background=element_blank())+

theme(panel.border=element_blank())

5.计算nodes的相关属性

中心度:点度频率(每种点度数的个数/所有点个数)

routes_tidy <-routes_tidy %>%

activate(nodes) %>%

mutate(centrality = degree(routes_tidy)/vcount(routes_tidy))

度:degree

#nodes的度

routes_tidy <-routes_tidy %>%

activate(nodes) %>%

mutate(degree = centrality_degree())

R画网络图的更多相关文章

  1. 使用R画地图数据

    用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...

  2. 用 R 画中国分省市地图

    用 R 画中国分省市地图 (2010-11-18 16:25:34) 转载▼ 标签: 中国地图 营销 杂谈 分类: 数据分析 用R 也可以做出漂亮的依参数变化的中国地图. 主要参考(http://co ...

  3. 用R画韦恩图

    #导入R包 library(grid)library(futile.logger)library(VennDiagram) #建立测试数据集 A = 1:150B = c(121:170,300:32 ...

  4. 用R画有图例的中国地图

    近期在网上找了几种画中国地图方法,终于认为这种方法还是最适用的 1.用googlevis包.因为中国国情如今已经不能訪问google地图了.所以大多中国用户来说仅仅能望洋兴叹了. 2.用ggplot包 ...

  5. R 画地图

    R 绘制中国省市分布地图 library(maps) library(mapdata) library(maptools); getColor=function(mapdata,provname,pr ...

  6. R画散点图、线型图、箱型图、直方图基本知识

    1.导入数据 2.散点图 plot(iris[,1]~iris[,4],xlab='Length',ylab='Width',col='red',main='Length VS Width')

  7. R 画structure图

    id percent  k1_B04_WL-1.fs_1   0.021 k31_B04_WL-1.fs_1   0.624 k21_B04_WL-1.fs_1   0.355 k1 K=3  数据输 ...

  8. r画饼图

    原始图样: library(ggplot2) dt = data.frame(A = c(2, 7, 4, 10, 1), B = c('B','A','C','D','E')) p = ggplot ...

  9. R画柱形图和箱线图

    数据格式如下 gene_id Sham-1 Sham-2 Sham-3 Sham-4 Sham-5 Rep-1h-1 Rep-1h-2 Rep-1h-3 Rep-1h-4 Rep-1h-5 Rep-3 ...

随机推荐

  1. Linux下编译GDAL

    一.准备工作 从官网下载GDAL.PROJ.4和GEOS,将其存放在/home/liml/Work/3rdPart目录并解压,如下图所示.下载地址请自行Google.注:使用的系统是CentOS6.4 ...

  2. C++链表模板类

    思想和上篇文章差不多,只是换了层包装. 直接上代码: // linklist.h #include <iostream> #include <cstdio> using nam ...

  3. 【Java编程】Java基本数据类型

    在较前面的一篇博文<C/C++基本数据类型>中,我主要介绍了c/c++的基本数据类型.我们知道C语言没有具体规定各类数据类型所占内存的字节数,只要求long型数据长度不小于int型,sho ...

  4. 如何在VS2013中进行Boost单元测试

    对于如何在VS2013中进行Boost单元测试,这方面资料太少.自己也因此走了不少弯路.下文将会阐述一下如何在VS2013中进行Boost单元测试. 在开始Boost单元测试之前,我们需要先安装VS2 ...

  5. Linux之ulimit详解(整理)

    修改:一般可以通过ulimit命令或编辑/etc/security/limits.conf重新加载的方式使之生效通过ulimit比较直接,但只在当前的session有效,limits.conf中可以根 ...

  6. IOS微信分享功能简单实现

    PS:此文以简单实现功能为主,不足之前还望指点,大神勿喷. 在此之前如何申请微信认证的Key就不说了,公司一般会有人搞 1.首先下载微信SDK:微信SDK下载地址(更多关于微信SDK信息文档请访问官方 ...

  7. Linux 系统应用编程——线程基础

    传统多任务操作系统中一个可以独立调度的任务(或称之为顺序执行流)是一个进程.每个程序加载到内存后只可以唯一地对应创建一个顺序执行流,即传统意义的进程.每个进程的全部系统资源是私有的,如虚拟地址空间,文 ...

  8. LeetCode(48)-Length of Last Word

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...

  9. java线程的同步控制--重入锁ReentrantLock

    我们常用的synchronized关键字是一种最简单的线程同步控制方法,它决定了一个线程是否可以访问临界区资源.同时Object.wait() 和Object.notify()方法起到了线程等待和通知 ...

  10. 深入浅出理解python 装饰器

    之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.先看下代码: import time # 将函数作为参数传入到此 ...