2015-02-25 1 views
9

Пытаясь найти сообщества в твитах. Сходство косинусов между разными словами составляет матрицу смежности. Затем я создал график из этой матрицы смежности. Визуализация графа задача здесь:Как распределить граф сообщества, сделанный с помощью пакета igraph в 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) 

Я просто хочу, чтобы иметь немного больше разрыва между отдельными кластерами/сообществами.

different communities are shown by different colors

+0

Пожалуйста, введите g или его пример –

+0

Вы пытались изменить область участка? По умолчанию используется 'area = vcount (graph)^2' (http://www.inside-r.org/packages/cran/igraph/docs/layout) –

+0

Просто обновлен с последним кодом и графиком, а именно: – magarwal

ответ

5

Насколько мне известно, вы не можете макет вершины одного и того же сообщества близко друг к другу, используя только igraph. Я реализовал эту функцию в своем пакете NetPathMiner. Кажется, немного сложно установить пакет только для функции визуализации. Я напишу простую версию этого здесь и объясню, что он делает.

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) 
} 

В основном, функция добавляет дополнительную вершину, которая соединена со всеми вершинами, принадлежащими к одному сообществу. Макет вычисляется на основе нового графика. Поскольку каждое сообщество теперь связано общей вершиной, они имеют тенденцию группироваться.

Как сказал Габор в комментарии, увеличение весов ребер также будет иметь схожий эффект. Функция использует эту информацию, увеличивая cluster.strength, ребра между созданными вершинами и их сообществами получают более высокие веса.

Если этого еще недостаточно, вы расширяете этот принцип (вычисляя макет на более связанном графике), добавляя ребра между всеми вершинами одних и тех же сообществ (образуя клику). По моему опыту, это немного перебор.

 Смежные вопросы

  • Нет связанных вопросов^_^