星期日, 六月 17, 2012

初次尝试igraph包


igraph是为了进行社会网络分析而创建的一个包。与R语言中同类包相比,它的速度更快,而且函数命令与图形展现更为丰富。它可以处理有向网络和无向网络,但无法处理混合网络。igraph中的函数非常多,本文只是初步的介绍如何创建图形,并提供一些简单的例子。
# 可以使用最基本的graph函数,用向量作为参数来创建图形,之后用plot绘制出结果
library(igraph)
g1 <- graph( c(0,1, 1,2, 2,3, 3,4))
plot(g1,layout=layout.circle(g1))

# 也可以画出一些特殊结构的图形,例如下面的星形图
g2 <- graph.star(10, mode = "in")
plot(g2,layout=layout.fruchterman.reingold(g2))

# 当然也能从文件创建图形
# 首先读入数据,整理后用graph.data.frame函数创建图形对象
traits <- read.csv('http://igraph.sourceforge.net/igraphbook/traits.csv', head=FALSE)
names(traits) <- c('name','age','gender')
traits[,1] <- sapply(strsplit(as.character(traits[,1]),' '),'[',1)
relation <- read.csv('http://igraph.sourceforge.net/igraphbook/relations.csv', head=FALSE)
names(relation) <- c('from','to','sameroom','friendship','advice')
g4 <- graph.data.frame(relation,vertices=traits)
plot(g4,layout=layout.kamada.kawai,vertex.shape='rectangle',vertex.label=V(g4)$name,vertex.size=20,asp=F)
# 可以通过summary函数观察内部结构,看到了10个顶点,34条边
summary(g4)

Vertices: 10
Edges: 34
Directed: TRUE
No graph attributes.
Vertex attributes: name, age, gender.
Edge attributes: sameroom, friendship, advice.


进一步我们用igraph包探索红楼梦中的一些主要人物之间社交关系,本文对关系的定义比较粗浅,即如果有两个人的名字出现在同一段落中,可以认为之间存在联系。红楼梦中共有3192个段落,我们分成两个部分来考虑,一部分是前八十回,另一部分是后四十回。
上图中姓名的大小表示了网络中人物的degree,也就是与其它人联系的多寡,线条的颜色深浅表示了联系的权重。可以看到几个主要人物之间关系非常紧密,相对弱点的是妙玉和巧姐,而且这两人之间也没什么联系。再来看后四十回的图。
后四十回的故事和人物都发生了重大转折,比较显著的是元春的联系越发的微弱,因为她的死去使得与各人物的联系大减,而且妙玉被劫,她和湘云之间也不再有联系。本例没有考虑其它的人物关系因素,也没有考虑人物的别名,权作娱乐之用。因为这段代码写得比较ugly,就不好意思拿出来献丑了。


igraph参考资料:

官方教学站http://igraph.sourceforge.net/igraphbook/
官方wiki http://igraph.wikidot.com/
http://www.stanford.edu/~messing/RforSNA.html

http://rdatamining.wordpress.com/2012/05/17/an-example-of-social-network-analysis-with-r-using-package-igraph/
http://librestats.com/2012/05/17/visualizing-the-cran-graphing-package-dependencies/
http://www.surefoss.org/visualisation/when-venn-diagrams-are-not-enough-visualizing-overlapping-data-with-social-network-analysis-in-r/
http://www.r-chart.com/2012/05/github-follower-graph-with-r.html
http://www.statistik.uni-dortmund.de/useR-2008/slides/Csardi.pdf

推荐图书:
introduction to social network methods
社会网络分析法
社交网络数据挖掘

11 条评论:

  1. 此评论已被作者删除。

    回复删除
  2. 才接触R语言 请教“线条的颜色深浅表示了联系的权重”应该如何表达?

    回复删除
    回复
    1. igraph的连线对象中有一个color属性,可以对其赋值就可以了,这个要看igraph手册就明白了。

      删除
  3. g1 <- graph( c(0,1, 1,2, 2,3, 3,4))
    错误于graph(c(0, 1, 1, 2, 2, 3, 3, 4)) :
    At structure_generators.c:84 : Invalid (negative) vertex id, Invalid vertex id
    请问这个是为什么?

    回复删除
  4. 能否分享一下代码?或告知如何显示中文,我使用igraph画图中文乱码。

    回复删除