首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >R绘制网络图

R绘制网络图

作者头像
生信交流平台
发布2020-08-05 15:51:34
发布2020-08-05 15:51:34
2.8K0
举报

对于网络图,其实我们并不陌生,用的比较普遍的是Cytoscape这个软件。不过,我们今天的主角是R包---igragh。相比Cytoscape,igragh的便利之处就是你不用趴在电脑上很痛苦的去一一调整节点的大小,颜色等属性。接下来,我就开启小白学习之旅了。

一、安装并加载所需R包

代码语言:javascript
复制
install.packages("igraph")
library(igraph)

二、使用方法

对于图 graph 这种数据结构而言,最基本的元素包括节点(node) 和 边(edge,节点之间的连线); igraph这个R包提供了很多种创建graph的方式,我们先看一个最简单的例子:

代码语言:javascript
复制
g1 <- graph( edges=c(1,2, 2,3, 3, 1), n=3, directed=F) 
plot(g1)
#简单用参数directed修改,directed参数控制graph有无方向,标明节点之间的指向性;
g2 <- graph( edges=c(1,2, 2,3, 3, 1), n=10)  #默认情况下,directed=T;
plot(g2)  

g1

g2

再举一个栗子,我们改变节点的颜色,标签位置等:

代码语言:javascript
复制
g3 <- graph( c("John", "Jim", "Jim", "Jack", "Jim", "Jack", "John", "John"), isolates=c("Jesse", "Janis", "Jennifer", "Justin") )
plot (g3, edge.arrow.size=.5, vertex.color=rgb(.25, .5, .3, alpha=.5), vertex.size=15, vertex.frame.color="gray", vertex.label.color="black", vertex.label.cex=0.8, vertex.label.dist=2, edge.curved=0.2)
#参数很多了,而且"Jesse", "Janis", "Jennifer", "Justin"均是独立的。改变graph()里的参数后(去掉isolates参数),network会有很大变化。

左右滑动查看完整内容

g3-1

g3-2

下面我们来了解一下在用igraph包画图时可能会用到的函数和参数。

(1)构建graph数据结构:

前面已经说过,igraph这个R包提供了很多种创建graph的方式。如上面的graph函数(也可以是make_graph()),其次还有

graph_from_literal()

graph_from_data_frame()

graph_from_incidence_matrix()

graph_from_adjacency_matrix()等

在R中,输入?graph_from后按table键可查看更多,这里我先讲上面提到的几种常见且易操作的函数。

(2)了解绘图,?Plot.igraph即可查看plot()函数更多参数:

NODES

vertex.color

节点颜色

vertex.frame.color

节点边框颜色

vertex.shape

节点的形状:有circle,square,csquare,rectangle, crectangle,vrectangle,pie,raster,sphere

vertex.size

节点的大小 (default is 15)

vertex.label

节点的标签

vertex.label.family

标签的字体系列 (e.g.“Times”, “Helvetica”)

vertex.label.font

字体: 1 plain, 2 bold, 3, italic, 4 bold italic, 5 symbol

vertex.label.cex

字体大小

vertex.label.dist

标签与顶点的距离(默认值为0,标签以顶点为中心)

vertex.label.degree

标签相对于顶点的位置, (0,pi,pi/2,-pi/2分别表示有,左,下和上)

EDGES

edge.color

边的颜色

edge.width

边宽, 默认值为1

edge.arrow.size

箭头大小,默认值为 1

edge.arrow.width

箭头宽度,默认值为 1

edge.lty

线条类型

edge.curved

边的曲率,范围0-1(FALSE设置为0,TRUE设置为0.5)

OTHER

layout

布局,通过layout参数可以方便的指定,使用不同的布局算法;对于不同类型的graph,有不同的自动化的布局算法,默认值为layout_nicely。

三、开始画图

代码语言:javascript
复制
#   graph_from_literal()函数
用这种描述简单构图: - 表示无向连接,+ - 或 - + 指向左和右的有向关系,++表示对称关系,“:”表示顶点集。
#无向图
gl <- gl <- graph_from_literal(A:B:C---D:e:f,g--h,o)
plot(gl)
# 有向图
plot(graph_from_literal( A +-+ B --- C ++ D + E)) 
#在有向图中B C之间是不相连的

无向图

有向图

代码语言:javascript
复制
##小贴士:  
·  无向图之间的连接使用-,或者---,这个长度是任意的,如graph_from_literal(A-B) 和 graph_from_literal(A-----B) 等价 , 多个顶点可以直接相连,如graph_from_literal(A---B----C---D);
·  图中的孤立点,可以逗号分开,作为独立的参数,如 上图的o;
·  顶点集,使用:连接的顶点为一个顶点集,顶点集之间的点不相连,其余点均与顶点相连。
·  使用+作为箭头;
·  有向图中,如果顶点之间没有箭头(+),则表示这两个点不相连,双向的箭头可以使用一个或者两个+代替;

左右滑动查看完整内容

代码语言:javascript
复制
#   graph_from_data_frame()函数,从文件中读取network数据(读取文件的方式就是常规数据读取方式,read.table 或 read.csv等)
#示例数据:

左右滑动查看完整内容

代码语言:javascript
复制
library(igraph)
net <- graph_from_data_frame(d=links, vertices=nodes, directed=T) 
class(net) ##查看net数据类型

代码语言:javascript
复制
### 用下面命令查看网络数据的nodes, edges及它们的属性:
E(net)
V(net)
E(net)$type
V(net)$media
####展示画图,调整画图参数:增加节点标签等
plot(net, edge.arrow.size=.2, edge.curved=0,
     vertex.color="skyblue", vertex.frame.color="#555555",
     vertex.label=V(net)$media, vertex.label.color="black",
     vertex.label.cex=.7)

代码语言:javascript
复制
##丰富网络图的内容;
colrs <- c("gray50", "tomato", "gold") #设置节点的分类颜色
V(net)$color <- colrs[V(net)$media.type] 
V(net)$size <- V(net)$audience.size*0.6   #设置节点大小
V(net)$label.color <- "black"    #设置节点颜色
E(net)$width <- E(net)$weight/6   #基于weight值设置边的宽度
E(net)$arrow.size <- .2   #设置箭头及边的大小
E(net)$edge.color <- "gray80"   #设置边的颜色
plot(net,vertex.label=V(net)$media,vertex.label.cex=.7) 

代码语言:javascript
复制
###添加标签,修改布局(layout)
ll <- layout_nicely(net)  ##更多布局用?igraph::layout_进行查看
plot(net, layout=ll)
legend(x=-1.5, y=-1.1, c("Newspaper","Television", "Online News"), pch=21,
       col="#777777", pt.bg=colrs, pt.cex=2, cex=.8, bty="n", ncol=1)

好了,igraph包的入门我就先讲到这里!现在要赶紧去动手实践哦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信交流平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档