2017-10-10 7 views
1

J'ai une question très simple concernant la combinaison de igraph avec visNetwork. Je veux pondérer les bords avec visEdges (value = E (graph) $ weight), mais cela ne fonctionne pas. Voici un exemple de jouet pour illustrer le problème:R visNetwork + visualisation de réseau pondérée igraph avec visEdges

 test 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 0 1 3 7 1 
[2,] 4 0 8 9 5 
[3,] 10 3 0 8 3 
[4,] 5 1 5 0 7 
[5,] 8 2 7 4 0 

library(igraph); library(visNetwork) 

test.gr <- graph_from_adjacency_matrix(test, mode="undirected", weighted=T) 

Si je vais maintenant essayer de le visualiser sous forme de graphique pondérée, il ne trace pas:

test.gr %>% 
    visIgraph(layout = "layout_in_circle") %>% 
    visEdges(value = E(test.gr)$weight) 

Si je

au lieu
test.gr %>% 
    visIgraph(layout = "layout_in_circle") %>% 
    visEdges(value = 10) 

, je reçois un terrain:

enter image description here

mais ce n'est bien sûr pas ce que je veux. Je veux des largeurs de bords différentes selon E (test.gr) $ weigth.

Pouvez-vous me dire comment je peux faire cela?

Répondre

2

Avec visNodes et visEdges vous pouvez définir les options globales pour tous les nœuds et les arêtes. Avec, par exemple, visNodes(shape = "square"), vous faites tous les carrés de noeuds. Vous comprenez que ce n'est pas la bonne façon de définir des largeurs de bord individuelles. Pour obtenir ce que vous voulez, vous pouvez convertir l'objet igraph en liste visNetwork. Ensuite, vous pouvez ajouter une colonne "attendue" avec le nom "valeur". visNetwork utilisera alors cette colonne pour donner du poids aux bords. Peut-être que ce n'est pas la meilleure solution, mais cela fonctionne.

test <- as.matrix(read.table(header = FALSE, text = " 
    0 1 3 7 1 
    4 0 8 9 5 
    10 3 0 8 3 
    5 1 5 0 7 
    8 2 7 4 0")) 

library(igraph) 
library(visNetwork) 

## make igraph object 
test.gr <- graph_from_adjacency_matrix(test, mode="undirected", weighted=T) 

## convert to VisNetwork-list 
test.visn <- toVisNetworkData(test.gr) 
## copy column "weight" to new column "value" in list "edges" 
test.visn$edges$value <- test.visn$edges$weight 

test.visn$edges 
# from to weight value 
# V1 V2  4  4 
# V1 V3  10 10 
# V1 V4  7  7 
# V1 V5  8  8 
# V2 V3  8  8 
# V2 V4  9  9 
# V2 V5  5  5 
# V3 V4  8  8 
# V3 V5  7  7 
# V4 V5  7  7 

visNetwork(test.visn$nodes, test.visn$edges) %>% 
    visIgraphLayout(layout = "layout_in_circle") 

Cela donne le graphique suivant:

enter image description here

S'il vous plaît, laissez-moi savoir si c'est ce que vous voulez.