[R-br] visualizar redes grandes com igraph

Roney Fraga Souza roneyfraga em gmail.com
Sábado Março 8 13:15:49 BRT 2014


Caros, 

Estou tentando aprimorar a visualização de uma rede grande onde possa identificar a evolução de grupos. A menor rede que tenho tem 5000 vértices e 40000 edges, 
sendo que a maior tem 240000 vertices e mais de 2 milhões de edges (ainda não sei como trabalhar com essa rede no R, mas isso é outra história).

A melhor visualização de rede que encontrei foi essa (figura a):

https://dl.dropboxusercontent.com/u/61883020/rede.grande.grupos.tiff

o autor utiliza o algoritmo de visalização large graph layout (LGL), disponível no pacote igraph em layout.lgl(). O problema é que não consegui combinar os argumentos
da função para gerar uma rede em formato 'esférico', com baixa nível de sobreposição dos grupos. 

Alguém tem alguma sugestão?


Atenciosamente
Roney


# ------------------------------
# Início código R
# ------------------------------

# carregando os pacotes igraph() e plyr()
library(igraph)
library(plyr)

# criando uma rede aleatória com quatro componentes fortemente conectados
# isso vai garantir grupos homogêneos  
#
# para realizar testes optei por criar uma rede pequena, pois, o tempo necessário para visualizar uma rede
# maior aumenta significativamente
g <- erdos.renyi.game(50, p=1/2) + erdos.renyi.game(50, p=1/2) + erdos.renyi.game(50, p=1/2) + erdos.renyi.game(50, p=1/2)

# adicionando links entre os quatro diferentes componentes
g <- add.edges(
	       g, 
	       c(1,51, 
		 1,52,
		 51,101,
		 51,102,
		 101,151,
		 102,152,	
		 150,151,
		 1,101,
		 1,102,
		 1,151,
		 1,200
		 )
	       )
g

# nomeando os vértices em uma sequencia de 1 a 200 (necessário para fazer o merge() nos próximos passos)
V(g)$name <- 1:200


# clusterizando
# A Clauset, MEJ Newman, C Moore: Finding community structure in very large networks
fc <- fastgreedy.community(as.undirected(g))


# quatro grupos foram identificados, como era de ser esperar
table(membership(fc))
sizes(fc)

# adicionado qual grupo cada vértice pertence
V(g)$grupo <- membership(fc)


# pretendo colorir os edges conforme o grupo de quem esta citando,
# para isso vou fazer um merge para adicionar esse atributo dos vértices nos edges

# criando um data frame dos vértices e de qual grupo este pertence
g.ver <- data.frame(
		    name=V(g)$name, 
		    grupo=V(g)$grupo
		    )
head(g.ver)


# criando um data frame dos edges
g.edg <-  as.data.frame(get.edgelist(g))
head(g.edg)
g.edg <- plyr::rename(g.edg, c('V1'='citante'))
g.edg <- plyr::rename(g.edg, c('V2'='citado'))


# adicionando qual grupo cada edge pertence, assumindo que se um vértice pertence ao 
# grupo 1 e tem 8 edges com outros vértices, todos os 8 nós pertencem ao grupo 1
g.edg2 <- merge(
		g.edg, 
		g.ver, 
		by.x = 'citante',
		by.y = 'name',
		all.x = TRUE, 
		all.y = F
		)
dim(g.edg2)
head(g.edg2)


# adicionando cores nos edges para os diferentes grupos
E(g)$grupo.citante <- g.edg2$grupo
E(g)[grupo.citante==1]$color <- 'dark green'
E(g)[grupo.citante==2]$color <- 'dark red'
E(g)[grupo.citante==3]$color <- 'dark blue'
E(g)[grupo.citante==4]$color <- 'sky blue'

# adicionado cores nos vértices para os diferentes grupos
V(g)[grupo==1]$color <- 'dark green'
V(g)[grupo==2]$color <- 'dark red'
V(g)[grupo==3]$color <- 'dark blue'
V(g)[grupo==4]$color <- 'sky blue'

# adicionado cores na borda dos vértices para os diferentes grupos
V(g)[grupo==1]$vertex.frame.color <- 'dark green'
V(g)[grupo==2]$vertex.frame.color <- 'dark red'
V(g)[grupo==3]$vertex.frame.color <- 'dark blue'
V(g)[grupo==4]$vertex.frame.color <- 'sky blue'


# http://igraph.sourceforge.net/doc/R/layout.html
# definir o layout da rede
l1 <- layout.lgl(
		 g
		 #                  maxiter = 150,		# The maximum number of iterations to perform (150)
		 #                  maxdelta = vcount(g),	# The maximum change for a vertex during an iteration (the number of vertices)
		 #                  area = 30*vcount(g)^2 	# The area of the surface on which the vertices are placed (square of the number of vertices)
		 #                  coolexp = ,	 		# The cooling exponent of the simulated annealing (1.5) 
		 #                  repulserad = vcount(g)  	# Cancellation radius for the repulsion (the area times the number of vertices)
		 #                  cellsize = 			# The size of the cells for the grid. When calculating the repulsion forces between vertices only vertices in the same or neighboring grid cells are taken into account (the fourth root of the number of area)
		 #                  root = 	 		# The id of the vertex to place at the middle of the layout. The default value is -1 which means that a random vertex is selected
		 )


plot(
     g, 
     layout = l1,
     vertex.label = NA, 
     vertex.size = 0.0000001,
     edge.arrow.size = FALSE,
     edge.arrow.width = FALSE,
     )

# ------------------------------
# Fim código R
# ------------------------------



Mais detalhes sobre a lista de discussão R-br