vlambda博客
学习文章列表

R语言igraph包绘制社会网络图

介绍利用R语言中的igraph包绘制社会网络图,效果图如下。在这张图中,主要的元素是节点和边。节点是我们关注的个体,其中重点关注的节点的size越大,且根据个体的情况,将之分为两类并用不同的颜色标识,节点上面是该节点的名称标签。边表示各个节点之间的联系,联系越紧密,边越粗,并且在边上面标注了相应的标签,可以标识联系的强度。

R语言igraph包绘制社会网络图

下面介绍绘图步骤与相应的代码。
第一步,数据存储。这里需要建立两个csv文件,命名为link.csv和node.csv,其中link里面存储节点之间的关系,node里面存储节点的信息。
如下,在node这张表中,id是每一个节点的唯一身份码,name是节点的名称,size是节点的尺寸,name.type是节点的类型。
R语言igraph包绘制社会网络图
如下,在link这张表中,from到to表示节点之间的关系,weight标识联系的强度,type标识联系类型。

第二步,读取数据。因为数据里面有中文,所以首先需要定义字体以及告诉R语言里面有中文,代码为:

windowsFonts( A=windowsFont("华文彩云"), B=windowsFont("华文仿宋"), C=windowsFont("华文行楷"), D=windowsFont("华文楷体"), E=windowsFont("华文隶书"), F=windowsFont("华文中宋"), G=windowsFont("华文细黑"), H=windowsFont("微软雅黑"), J=windowsFont("华文新魏"), K=windowsFont("幼圆") )#下面一行代码解决不能显示中文Sys.setlocale(category="LC_ALL",locale="en_US.UTF-8")

当然,我们还需要安装igraph包:

install.packages("igraph")

读取数据的代码为:

links<-read.csv("D:/network/data.csv",header = T,as.is=T)nodes<-read.csv("D:/network/node.csv",header = T,as.is=T)

这里我们将读取的数据赋予两个新的变量links和nodes。还可以通过head()预览数据:

> head(links) from to weight type1 a1 s1 10 hyperlink2 a2 s2 2 hyperlink3 a3 s3 2 hyperlink4 a4 s4 3 hyperlink5 a5 s5 3 hyperlink6 a6 s6 3 hyperlink> head(nodes) id name size name.type1 a1 古月 10 12 a2 N2 3 13 a3 N3 8 14 a4 N4 7 15 a5 name5 6 16 a6 name6 5 1

第三步,生成网络分析的数据并绘图。代码如下:

library(igraph) #载入igraph包(net<-graph.data.frame(links,nodes,directed = T)) #生成网络分析数据colrs<- c("#87cefa","red") #定义两个颜色(因为节点有两个类型),可以用颜色代码,或者英文单词V(net)$color<-colrs[V(net)$name.type] #设置节点的颜色E(net)$width<-E(net)$weight/3  #设置边的宽度,这个宽度是weight除以3,也可以是别的数E(net)$label<-E(net)$weight #设置边的标签deg <- igraph::degree(net, mode="all")V(net)$size <- deg*14  #和前面一行代码一起设置节点大小,扩大了14倍plot(net,layout=layout.circle,          #节点的布局 edge.arrow.size=0.5, #设置箭头大小     vertex.frame.color="transparent",  #节点边框透明     vertex.label.color="black",        #节点标签黑色     vertex.label.cex=1.25,             #节点标签大小     vertex.label.family="B",           #节点标签字体     edge.curved=0.5,                   #边是否弯曲,取值0-1,0为不弯曲     edge.color="pink"                  #边的颜色 )

plot(net)是绘图命令,后面的均是对图的定义修饰。layout定义图的布局,包括layout.circle圆形布局,即前述效果图,layout.random随机布局,以及layout.sphere/layout.drl/layout.star/layout.spring等等。

最后输出图例:

legend(x=-1.5, y=-1.1, c("typ1","typ2"),  pch=21, col="#777777", pt.bg=colrs,        pt.cex=2, cex=.8, bty="n", ncol=1)

数据的存储除了上面的方式之外,还可以是共现矩阵或者临近矩阵,关于如何从大量的文本中生成我们需要的共现矩阵或者临近矩阵,将会在后面利用Python实现。