igraph包——绘制网络图

2021-04-09 10:46:58 浏览数 (4)

本文是复杂网络课的一个小作业,主要学习如何导入图数据以及如何利用igraph包绘制网络图

导入边数据和节点数据

这里主要是将边数据和节点数据分别导入,再利用igraph包中的graph_from_data_frame()将边,节点数据进行合并构成一个网络图。注意:节点数据中可包含一些属性(年龄,性别等),这些属性可以再在分析和绘图中起到较大作用。比如:各个节点的形状可由年龄大小决定,节点颜色可由性别决定。在我们本文的数据中,只包含一个节点属性(课程所含类别:1,2,3,4),数据包含36个节点,35条边。

代码语言:javascript复制
edges <- read.table('edge.csv', header=T, sep=',') #导入边数据
vertices <- read.table('vertices.csv', header=T, sep=',') #导入节点数据
edges;vertices
graph <- graph_from_data_frame(edges, directed = F, vertices=vertices)

directed = TRUE表示有方向;如果不需要节点数据,可以设置vertices=NULL。接下来对改图进行绘制,有两种生成方式,一是直接绘制,参数放plot()里面;二是通过修改图的方式设置参数,然后利用plot()绘制。

生成方式1(没有颜色分类)

代码语言:javascript复制
igraph.options(vertex.size=3, vertex.label=NA, edge.arrow.size=0.5)
V(graph)$color <- colrs[V(graph)$color]
plot(graph,  
     layout=layout.reingold.tilford(graph,circular=T),  #layout.fruchterman.reingold表示弹簧式发散的布局,
     vertex.size=5,     #节点大小  
     vertex.shape='circle',    #节点不带边框none,,圆形边框circle,方块形rectangle  
     vertex.color="lightgreen",#设置颜色,其他如red,blue,cyan,yellow等
     vertex.label=vertices$name, #NULL表示不设置,为默认状态  
     vertex.label.cex=0.8,    #节点字体大小  
     vertex.label.color='black',  #节点字体颜色,red  
     vertex.label.dist=0.4,   #标签和节点位置错开
     edge.arrow.size=0,#连线的箭头的大小,若为0即为无向图,当然有些数据格式不支持有向图  
     edge.width = 0.5, #连接线宽度
     edge.color="gray")  #连线颜色

效果如下:

当然,上面的plot函数中,很多参数你都可以使用默认参数,最主要的是layout的设置。下面我整理了一些用的比较多的选项。

生成方式2(有颜色分类)

这里主要是将节点的属性color加入其中,通过颜色来呈现。因为节点比较多,所以把V(graph)$size调的比较小。

代码语言:javascript复制
l = layout.reingold.tilford(graph,circular=T)
V(graph)$size <- 8  
colrs <- c('#0096ff', "lightblue", "azure3","firebrick1")
V(graph)$color <- colrs[vertices$color] #根据类型设置颜色,按照类型分组
V(graph)$label.color <- 'black' #设置节点标记的颜色
V(graph)$label <- V(graph)$name 
E(graph)$arrow.size=0.3 #设置箭头大
#生成图
plot(graph, layout=l)

效果如下:

参考文献:Statistical Analysis of Network Data with R by Eric D. Kolaczyk, Gábor Csárdi

0 人点赞