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
# ------------------------------

_______________________________________________
R-br mailing list
R-br@listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código 
mínimo reproduzível.

Responder a