数据集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"))
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)
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"))