R语言igraph包绘制社会网络图
第二步,读取数据。因为数据里面有中文,所以首先需要定义字体以及告诉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 type
1 a1 s1 10 hyperlink
2 a2 s2 2 hyperlink
3 a3 s3 2 hyperlink
4 a4 s4 3 hyperlink
5 a5 s5 3 hyperlink
6 a6 s6 3 hyperlink
head(nodes)
id name size name.type
1 a1 古月 10 1
2 a2 N2 3 1
3 a3 N3 8 1
4 a4 N4 7 1
5 a5 name5 6 1
6 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实现。