图的布局

数据集aidsblog是由Gopal在2005年8月随机选择的三天时间里收集得来,博客网络记录了与艾滋病、病人和支持网络有关的146个独立博客之间的引用关系.

library(sand)
library(igraph)
#建立一个5*5*5的网格
g.l<-make_lattice(c(5,5,5))

#博客网络
data(aidsblog)
summary(aidsblog)
## IGRAPH 3e85e7e D--- 146 187 --
V(aidsblog)
## + 146/146 vertices, from 3e85e7e:
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
##  [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
##  [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
##  [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
##  [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
##  [91]  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108
## [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
## [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
## [145] 145 146
E(aidsblog)
## + 187/187 edges from 3e85e7e:
##  [1]   7-> 1  37-> 2  37-> 3   7-> 4 118-> 5   7-> 6 143-> 7  73-> 8 118-> 9
## [10]   7->10 118->11 143->12   7->13   7->14  73->15 118->16 142->17  73->18
## [19]   7->19 118->20  73->21 118->22 143->23 143->24   7->25   7->26  12->27
## [28]   7->28   7->29  73->30 143->31  73->32 143->33  12->34 143->35 118->36
## [37]  37->37  12->38   7->39   7->40  12->41   7->42 143->43 118->44  73->45
## [46]  37->46   7->47 143->48   7->49 143->50   7->51 118->52  73->53  37->54
## [55]  12->55 143->56  12->57   7->58 143->59 143->60  37->61  73->62  37->63
## [64]   7->64  37->65 143->66 118->67  12->68  12->69  37->70  12->71 142->72
## [73] 143->73  12->74   7->75  12->76  12->77   7->78 142->79   7->80   7->81
## [82]  12->82  12->83 143->84  73->85 143->86 118->87 118->88  37->89 142->90
## + ... omitted several edges
#环形布局(circular layout)
igraph_options(vertex.size=3,vertex.label=NA,edge.arrow.size=0.5)
par(mfrow=c(1,2),mai=c(0.2,0.2,0.2,0.2))
plot(g.l,layout=layout_in_circle,main="5X5X5 lattice")
plot(aidsblog,layout=layout_in_circle,main="Blog Network")

#基于弹簧模型(spring-embedder method)的绘图方法:layout.fruchterman.reingold
par(mfrow=c(1,2),mai=c(0.2,0.2,0.2,0.2))
plot(g.l,layout=layout.fruchterman.reingold,main="5X5X5 lattice")
plot(aidsblog,layout=layout.fruchterman.reingold,main="Blog Network")

#基于能量布局算法(energy-placement methods)的绘图方法:layout.kamada.kawai,
#此方法是一种基于多维标度分析(multidimensional scaling,MDS) 的算法, 
# 在社交网络文献中使用多年
par(mfrow=c(1,2),mai=c(0.2,0.2,0.2,0.2))
plot(g.l,layout=layout.kamada.kawai,main="5X5X5 lattice")
plot(aidsblog,layout=layout.kamada.kawai,main="Blog Network")

# 树图的三种布局:环形、辐射、分层
g.tree<-graph.formula(1-+2,1-+3,1-+4,2-+5,2-+6,2-+7,
                      3-+8,3-+9,4-+10)
par(mfrow=c(1,3),mai=c(0.2,0.2,0.2,0.2))
igraph.options(vertex.size=30,edge.arrow.size=0.5,
                vertex.label=NULL)
plot(g.tree,layout=layout.circle)
plot(g.tree,layout=layout.reingold.tilford(g.tree,circular=T))
plot(g.tree,layout=layout.reingold.tilford)

# 二部图布局
par(mfrow=c(1,2),mai=c(0.2,0.2,0.2,0.2))
plot(g.bip,layout=layout.bipartite)
plot(g.bip,layout=-layout.bipartite(g.bip)[,2:1],
      vertex.size=30,vertex.shape=ifelse(V(g.bip)$type,"rectangle","circle"),
      vertex.color=ifelse(V(g.bip)$type,"red","cyan"))

Zachary 空手道俱乐部网络

library(igraphdata)
data(karate)

#可重复的布局
set.seed(42)
l<-layout.kamada.kawai(karate)

#首先绘制未修饰的图
igraph.options(vertex.size=10)
par(mfrow=c(1,1),mai=c(0.2,0.2,0.2,0.2))
plot(karate,layout=l,vertex.label=V(karate))

#修饰图,首先设定标签
V(karate)$label<-sub("Actor","",V(karate)$name)

#两个领导者与其他俱乐部成员的节点形状不同
V(karate)$shape<-"circle"
V(karate)[c("Mr Hi","John A")]$shape<-"rectangle"

#使用颜色区分不同派别
V(karate)[Faction==1]$color<-"red"
V(karate)[Faction==2]$color<-"dodgerblue"

#节点面积正比于节点强度(即所有关联边的权重之和)
V(karate)$size<-4*sqrt(graph.strength(karate))
V(karate)$size2<-V(karate)$size*.5

#将共同活动的数量设定为边的权重/粗细
E(karate)$width<-E(karate)$weight

#使用颜色区分派别内部和派别之间的边
F1<-V(karate)[Faction==1]
F2<-V(karate)[Faction==2]
E(karate)[F1%--%F1]$color<-"pink"
E(karate)[F2%--%F2]$color<-"lightblue"
E(karate)[F1%--%F2]$color<-"yellow"

#较小节点的标签位置偏移量(初始为0)
V(karate)$label.dist<-ifelse(V(karate)$size>=10,0,0.75)

#使用相同布局绘制修饰后的图
plot(karate,layout=l)

#调整节点和边的属性

library(sand)
data(lazega)
lazega
## IGRAPH 3e8b2bf UN-- 36 115 -- 
## + attr: name (v/c), Seniority (v/n), Status (v/n), Gender (v/n), Office
## | (v/n), Years (v/n), Age (v/n), Practice (v/n), School (v/n)
## + edges from 3e8b2bf (vertex names):
##  [1] V1 --V17 V2 --V7  V2 --V16 V2 --V17 V2 --V22 V2 --V26 V2 --V29 V3 --V18
##  [9] V3 --V25 V3 --V28 V4 --V12 V4 --V17 V4 --V19 V4 --V20 V4 --V22 V4 --V26
## [17] V4 --V28 V4 --V29 V4 --V31 V5 --V18 V5 --V24 V5 --V28 V5 --V31 V5 --V32
## [25] V5 --V33 V6 --V24 V6 --V28 V6 --V30 V6 --V31 V6 --V32 V7 --V18 V9 --V12
## [33] V9 --V16 V9 --V29 V10--V24 V10--V26 V10--V29 V10--V31 V10--V34 V11--V17
## [41] V12--V15 V12--V16 V12--V17 V12--V19 V12--V26 V12--V29 V12--V34 V13--V31
## [49] V13--V33 V14--V16 V14--V17 V14--V25 V14--V28 V14--V30 V14--V32 V15--V16
## + ... omitted several edges
summary(lazega)
## IGRAPH 3e8b2bf UN-- 36 115 -- 
## + attr: name (v/c), Seniority (v/n), Status (v/n), Gender (v/n), Office
## | (v/n), Years (v/n), Age (v/n), Practice (v/n), School (v/n)
V(lazega)$Office
##  [1] 1 1 2 1 2 2 2 1 1 1 1 1 1 2 3 1 1 2 1 1 1 1 1 1 2 1 1 2 1 2 2 2 2 1 2 1
V(lazega)$Practice
##  [1] 1 2 1 2 1 1 2 1 2 2 1 2 1 2 2 2 2 1 2 1 1 1 1 1 2 1 1 2 2 1 1 1 1 2 2 1
V(lazega)$Seniority
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30 31 32 33 34 35 36
V(lazega)$Years
##  [1] 31 32 13 31 31 29 29 28 25 25 23 24 22  1 21 20 23 18 19 19 17  9 16 15 15
## [26] 15 13 11 10  7  8  8  8  8  8  5
#使用颜色表示办公地点
colbar<-c("red","dodgerblue","goldenrod")
v.colors<-colbar[V(lazega)$Office]

#使用形状表示执业类型
v.shapes<-c("circle","square")[V(lazega)$Practice]
v.size<-3.5*sqrt(V(lazega)$Years)

#节点标签为个人资历
v.label<-V(lazega)$Seniority

#可重复布局
set.seed(42)
par(mfrow=c(1,2),mai=c(0.2,0.2,0.2,0.2))
l<-layout.fruchterman.reingold(lazega)
plot(lazega,layout=l,vertex.color=v.colors,
            vertex.shape=v.shapes,vertex.size=v.size,vertex.label=v.label)

个体中心网(egocentric network):以空手道网络karate为例,提取每个节点周围一阶邻居.

data(karate)
par(mfrow=c(1,1),mai=c(0.2,0.2,0.2,0.2))
plot(karate)

vcount(karate)
## [1] 34
k.nbhds<-graph.neighborhood(karate,order=1)
sapply(k.nbhds,vcount)
##  [1] 17 10 11  7  4  5  5  5  6  3  4  2  3  6  3  3  3  3  3  4  3  3  3  6  4
## [26]  4  3  5  4  5  5  7 13 18
#提取两个最大的子图并绘图
k.1<-k.nbhds[[1]]
k.34<-k.nbhds[[34]]
par(mfrow=c(1,2),mai=c(0.2,0.2,0.2,0.2))
plot(k.1,vertex.label=NA,vertex.color=c("red",rep("lightblue",16)))
plot(k.34,vertex.label=NA,vertex.color=c(rep("lightblue",17),"red"))