2017-05-19 2 views
0

J'utilise igraph pour tracer un réseau de force non dirigée.Vertex Étiquettes en igraph R

J'ai un dataframe de nodes et links comme suit:

> links 
    source target value sourceID targetID 
1  3  4 0.6245 1450552 1519842 
2  6  8 0.5723 2607133 3051992 
3  9  7 0.7150 3101536 3025831 
4  0  1 0.7695 401517 425784 
5  2  5 0.5535 1045501 2258363 

> nodes 
     name group size 
1 401517  1 8 
2 425784  1 8 
3 1045501  1 8 
4 1450552  1 8 
5 1519842  1 8 
6 2258363  1 8 
7 2607133  1 8 
8 3025831  1 8 
9 3051992  1 8 
10 3101536  1 8 

Je conspire ces utilisant igraph comme suit:

gg <- graph.data.frame(links,directed=FALSE) 
plot(gg, vertex.color = 'lightblue', edge.label=links$value, vertex.size=1, edge.color="darkgreen", 
    vertex.label.font=1, edge.label.font =1, edge.label.cex = 1, 
    vertex.label.cex = 2) 

enter image description here

Sur cette parcelle, igraph a utilisé le index de proxy pour source et target comme étiquettes de sommet.

Je veux utiliser les vrais ID, dans mon links table exprimée en sourceID et targetID.

Ainsi, pour:

source target value sourceID targetID 
1  3  4 0.6245 1450552 1519842 

Cela montrerait que:

(1450552) ----- 0.6245 ----- (1519842) 

Au lieu de:

 (3) ----- 0.6245 ----- (4) 

(Notez que les indices proxy sont nuls indexées dans le links dataframe et un indexé dans la trame de données nodes Ce décalage de 1 est nécessaire pour igraph traçage).

Je sais que je dois en quelque sorte match ou map les indices proxy à leur correspondant name dans le nodes dataframe. Cependant, je suis à la perte car je ne connais pas l'ordre dans lequel igraph trace les étiquettes.

Comment puis-je y parvenir?

J'ai consulté les questions suivantes en vain:

Vertex Labels in igraph with R how to specify the labels of vertices in R R igraph rename vertices

Répondre

1

Vous pouvez spécifier les étiquettes comme ceci:

library(igraph) 
gg <- graph.data.frame(
    links,directed=FALSE, 
    vertices = rbind(
    setNames(links[,c(1,4)],c("id","label")), 
    setNames(links[,c(2,5)], c("id","label")))) 
plot(gg, vertex.color = 'lightblue', edge.label=links$value, 
    vertex.size=1, edge.color="darkgreen", 
    vertex.label.font=1, edge.label.font =1, edge.label.cex = 1, 
    vertex.label.cex = 2) 

enter image description here

Vous pouvez également passer

merge(rbind(
    setNames(links[,c(1,4)],c("id","label")), 
    setNames(links[,c(2,5)], c("id","label"))), 
    nodes, 
    by.x="label", by.y="name") 

à l'argument des sommets si vous avez besoin les autres attributs de nœud.

données:

links <- read.table(header=T, text=" 
    source target value sourceID targetID 
1  3  4 0.6245 1450552 1519842 
2  6  8 0.5723 2607133 3051992 
3  9  7 0.7150 3101536 3025831 
4  0  1 0.7695 401517 425784 
5  2  5 0.5535 1045501 2258363") 

nodes <- read.table(header=T, text=" 
     name group size 
1 401517  1 8 
2 425784  1 8 
3 1045501  1 8 
4 1450552  1 8 
5 1519842  1 8 
6 2258363  1 8 
7 2607133  1 8 
8 3025831  1 8 
9 3051992  1 8 
10 3101536  1 8") 
+0

Merci pour votre réponse . Vraiment utile. Quand vous dites 'vous pourriez passer ... à l'argument des sommets ', que voulez-vous dire exactement? Voulez-vous définir 'vertex.attr = merge ....'? – Chuck

+0

Je voulais dire 'graph.data.frame (..., vertices = merge (...))'. – lukeA

+0

Excellent, très apprécié. – Chuck

1

La solution la plus simple serait de réorganiser les colonnes de links, parce que, selon la documentation:

« Si les sommets est NULL, les deux premières colonnes de d sont utilisés comme une liste d'arêtes symbolique et des colonnes supplémentaires comme attributs d'arêtes. "

Par conséquent, votre code donnera la sortie correcte après l'exécution:

links <- links[,c(4,5,3)] 
+0

Merci! Je vais l'essayer. – Chuck

1

Il semble que j'ai pu la reformater réponse à cette question pour y parvenir.

r igraph - how to add labels to vertices based on vertex id

La clé est d'utiliser l'attribut vertex.label au sein plot() et sélectionnez un sous-ensemble de tranches nodes$names.

Pour notre index, nous pouvons utiliser automatiquement les étiquettes par défaut ordonnées retournées en igraph. Pour les extraire, vous pouvez taper V(gg)$names.

Dans plot(gg) nous pouvons écrire:

vertex.label = nodes[c(as.numeric(V(gg)$name)+1),]$name 
# 1 Convert to numeric 
# 2 Add 1 for offset between proxy links index and nodes index 
# 3 Select subset of nodes with above as row index. Return name column 

code complet:

gg <- graph.data.frame(links,directed=FALSE) 
plot(gg, vertex.color = 'lightblue', edge.label=links$value, vertex.size=1, edge.color="darkgreen", 
    vertex.label.font=1, edge.label.font =1, edge.label.cex = 1, 
    vertex.label.cex = 2, vertex.label = nodes[c(as.numeric(V(gg)$name)+1),]$name) 

Avec les données ci-dessus, ce qui a donné:

enter image description here