R画网络图
R 画网络图
目的:用R做生信分析,画基因样本的网络图,从中观察样本的致病性情况。
一、所用到的包
- library(tidyr)
- library(ggplot2)
- library(reshape2)
- library(readr)
- library(network)
- library(dplyr)
- library(plyr)
- library(sna)
- library(GGally)
- library(ggnetwork)
- library(tidygraph)# tidy graph analysis
- #library(tidyverse)# tidy data analysis
- library(ggraph)
- library(stringr)
- library(networkD3)
- library(igraph)
- library(visNetwork)
- library(threejs)
- library(ndtv)
- library(grid)
- library(Rmisc)
- #library(vioplot)
- 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画网络图的更多相关文章
- 使用R画地图数据
用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...
- 用 R 画中国分省市地图
用 R 画中国分省市地图 (2010-11-18 16:25:34) 转载▼ 标签: 中国地图 营销 杂谈 分类: 数据分析 用R 也可以做出漂亮的依参数变化的中国地图. 主要参考(http://co ...
- 用R画韦恩图
#导入R包 library(grid)library(futile.logger)library(VennDiagram) #建立测试数据集 A = 1:150B = c(121:170,300:32 ...
- 用R画有图例的中国地图
近期在网上找了几种画中国地图方法,终于认为这种方法还是最适用的 1.用googlevis包.因为中国国情如今已经不能訪问google地图了.所以大多中国用户来说仅仅能望洋兴叹了. 2.用ggplot包 ...
- R 画地图
R 绘制中国省市分布地图 library(maps) library(mapdata) library(maptools); getColor=function(mapdata,provname,pr ...
- R画散点图、线型图、箱型图、直方图基本知识
1.导入数据 2.散点图 plot(iris[,1]~iris[,4],xlab='Length',ylab='Width',col='red',main='Length VS Width')
- 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 数据输 ...
- r画饼图
原始图样: library(ggplot2) dt = data.frame(A = c(2, 7, 4, 10, 1), B = c('B','A','C','D','E')) p = ggplot ...
- 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 ...
随机推荐
- Linux下编译GDAL
一.准备工作 从官网下载GDAL.PROJ.4和GEOS,将其存放在/home/liml/Work/3rdPart目录并解压,如下图所示.下载地址请自行Google.注:使用的系统是CentOS6.4 ...
- C++链表模板类
思想和上篇文章差不多,只是换了层包装. 直接上代码: // linklist.h #include <iostream> #include <cstdio> using nam ...
- 【Java编程】Java基本数据类型
在较前面的一篇博文<C/C++基本数据类型>中,我主要介绍了c/c++的基本数据类型.我们知道C语言没有具体规定各类数据类型所占内存的字节数,只要求long型数据长度不小于int型,sho ...
- 如何在VS2013中进行Boost单元测试
对于如何在VS2013中进行Boost单元测试,这方面资料太少.自己也因此走了不少弯路.下文将会阐述一下如何在VS2013中进行Boost单元测试. 在开始Boost单元测试之前,我们需要先安装VS2 ...
- Linux之ulimit详解(整理)
修改:一般可以通过ulimit命令或编辑/etc/security/limits.conf重新加载的方式使之生效通过ulimit比较直接,但只在当前的session有效,limits.conf中可以根 ...
- IOS微信分享功能简单实现
PS:此文以简单实现功能为主,不足之前还望指点,大神勿喷. 在此之前如何申请微信认证的Key就不说了,公司一般会有人搞 1.首先下载微信SDK:微信SDK下载地址(更多关于微信SDK信息文档请访问官方 ...
- Linux 系统应用编程——线程基础
传统多任务操作系统中一个可以独立调度的任务(或称之为顺序执行流)是一个进程.每个程序加载到内存后只可以唯一地对应创建一个顺序执行流,即传统意义的进程.每个进程的全部系统资源是私有的,如虚拟地址空间,文 ...
- LeetCode(48)-Length of Last Word
题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...
- java线程的同步控制--重入锁ReentrantLock
我们常用的synchronized关键字是一种最简单的线程同步控制方法,它决定了一个线程是否可以访问临界区资源.同时Object.wait() 和Object.notify()方法起到了线程等待和通知 ...
- 深入浅出理解python 装饰器
之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.先看下代码: import time # 将函数作为参数传入到此 ...