网络图是一种常用的数据可视化手段,广泛应用于社会关系挖掘,文本挖掘中。今天这篇短文主要讲解不同数据类型下网络图的绘制。涉及常用的邻接阵、边数据框以及双边邻接阵三种数据类型,鉴于各种绘制网络图的R包都直接或间接的依赖于igraph包,为减少大家的阅读负担,本文所有的操作都在igraph中操作,后续的博文中会陆续介绍如何使用其他封装度高的包绘制网络图。这样一来必然导致绘制的网络图非常丑陋,不过这不是这节的重点,本文的重点是认识绘制网络图的数据类型以及不同数据类型下网络图的绘制方法。
邻接阵是一个简单0,1的方阵。矩阵的行列名称都为网络图的节点,0表示两个节点无关,1表示两个节点有关联。
set.seed(20171008)
indactor=rbinom(25,1,0.55)
dta=matrix(indactor,ncol=5)
row.names(dta)=LETTERS[1:5]
colnames(dta)=LETTERS[1:5]
dta
对邻接阵使用graph.adjacency构造网络图对象,然后使用plot绘制
ga=graph.adjacency(dta,mode="undirected",weighted=NULL)
ga
plot(ga)
边数据框是最直接的绘制网络图的数据类型,它有两列分别表示网络图中每一边的出发点和结束点。为了便于与第一种数据类型比较,这里使用了相同的对应关系。
Edges=data.frame(from=c('A','A','A','B','B','B','B','C','C','D'),
to=c('B','C','E','B','C','D','E','C','D','E'),stringsAsFactors = F)
head(Edges)
对边数据框使用graph.data.frame构造网络图对象,然后使用plot绘制
gb=graph.data.frame(Edges,directed=FALSE)
gb
plot(gb)
双边邻接阵是一种比较切合实际的数据类型,它的类型与邻接阵基本一样,但它的列名和行名不同
A=c(1,1,0,0)
B=c(1,0,1,0)
C=c(1,0,1,0)
D=c(0,1,0,1)
E=c(0,0,1,1)
dtc=matrix(c(A,B,C,D,E),nrow=5,byrow=TRUE)
dimnames(dtc)=list(c("A","B","C","D","E"),c("Group1","Group2","Group3","Group4"))
dtc
对双边邻接阵使用graph.incidence构造网络图对象,然后使用plot绘制,为了更好展现这种数据类型,我对网络图节点的特征进行了简单设置
#前5个点用圈表示,后5个用方块表示
shapes=c("circle","circle","circle","circle","circle","square","square",
"square","square")
#设置点的位置,前5个位于中心,后5个向偏移0.6个单位
labeldistances=c(0,0,0,0,0,0.6,0.6,0.6,0.6)
#vertex.label.degree用来规定点标签放置的位置
plot(gc,vertex.shape=shapes,vertex.label.degree=-pi/2,
vertex.label.dist=labeldistances,vertex.color=V(gc)$type)
推荐阅读
Python微课:用Python验证你的策略吧!——Zipline回测
Python微课 | Seaborn——Python优雅绘图(上)
更多微课请关注【数萃大数据】公众号,点击学习园地—可视化
欢迎大家关注微信公众号:数萃大数据