2015-02-25 19 views
9

Cercando di trovare comunità nei dati dei tweet. La somiglianza del coseno tra parole diverse forma la matrice di adiacenza. Quindi, ho creato il grafico da quella matrice di adiacenza. La visualizzazione del grafico è il compito qui:Come distribuire il grafico della comunità realizzato utilizzando il pacchetto igraph in R

# Document Term Matrix 
dtm = DocumentTermMatrix(tweets) 

### adjust threshold here 
dtms = removeSparseTerms(dtm, 0.998) 
dim(dtms) 

# cosine similarity matrix 
t = as.matrix(dtms) 

# comparing two word feature vectors 
#cosine(t[,"yesterday"], t[,"yet"]) 

numWords = dim(t)[2] 

# cosine measure between all column vectors of a matrix. 
adjMat = cosine(t) 

r = 3 
for(i in 1:numWords) 
{ 
    highElement = sort(adjMat[i,], partial=numWords-r)[numWords-r] 
    adjMat[i,][adjMat[i,] < highElement] = 0 
} 

# build graph from the adjacency matrix 
g = graph.adjacency(adjMat, weighted=TRUE, mode="undirected", diag=FALSE) 
V(g)$name 

# remove loop and multiple edges 
g = simplify(g) 
wt = walktrap.community(g, steps=5) # default steps=2 
    table(membership(wt)) 

# set vertex color & size 
nodecolor = rainbow(length(table(membership(wt))))[as.vector(membership(wt))] 
nodesize = as.matrix(round((log2(10*membership(wt))))) 
nodelayout = layout.fruchterman.reingold(g,niter=1000,area=vcount(g)^1.1,repulserad=vcount(g)^10.0, weights=NULL) 

par(mai=c(0,0,1,0)) 
plot(g, 
    layout=nodelayout, 
    vertex.size = nodesize, 
    vertex.label=NA, 
    vertex.color = nodecolor, 
    edge.arrow.size=0.2, 
    edge.color="grey", 
    edge.width=1) 

Voglio solo avere un po 'più di spazio tra cluster separati/comunità.

different communities are shown by different colors

+0

si prega di inserire il g o un esempio di esso –

+0

Hai provato a cambiare l'area del complotto? Il valore predefinito è 'area = vcount (grafico)^2' (http://www.inside-r.org/packages/cran/igraph/docs/layout) –

+0

Appena aggiornato con l'ultima versione del codice e grafico. – magarwal

risposta

5

Per quanto a mia conoscenza, non si può vertici di layout della stessa comunità vicine l'una all'altra, utilizzando IGRAPH solo. Ho implementato questa funzione nel mio pacchetto NetPathMiner. Sembra che sia un po 'difficile installare il pacchetto solo per la funzione di visualizzazione. Scriverò qui una versione semplice e spiegherò che cosa fa.

layout.by.attr <- function(graph, wc, cluster.strength=1,layout=layout.auto) { 
     g <- graph.edgelist(get.edgelist(graph)) # create a lightweight copy of graph w/o the attributes. 
     E(g)$weight <- 1 

     attr <- cbind(id=1:vcount(g), val=wc) 
     g <- g + vertices(unique(attr[,2])) + igraph::edges(unlist(t(attr)), weight=cluster.strength) 

     l <- layout(g, weights=E(g)$weight)[1:vcount(graph),] 
     return(l) 
} 

Fondamentalmente, la funzione aggiunge un vertice supplementare che è collegato a tutti i vertici che appartengono alla stessa comunità. Il layout è calcolato in base al nuovo grafico. Poiché ogni comunità è ora collegata da un vertice comune, tende a raggrupparsi insieme.

Come ha detto Gabor nel commento, anche l'aumento dei pesi dei bordi avrà un effetto simile. La funzione sfrutta queste informazioni, aumentando il valore di cluster.strength, i bordi tra i vertici creati e le loro comunità hanno un peso maggiore.

Se ciò non è ancora sufficiente, estendere questo principio (calcolando il layout su un grafico più connesso) aggiungendo i bordi tra tutti i vertici delle stesse comunità (formando una cricca). Dalla mia esperienza, questo è un po 'eccessivo.