2017-05-19 9 views
0

Ich benutze igraph um ein nicht gerichtetes Kraft-Netzwerk zu plotten.Vertex Labels in igraph R

Ich habe einen Datenrahmen von nodes und links wie folgt:

> 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 

ich diese mit igraph plotten wie folgt:

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

Auf diesem Grundstück hat IGRAPH verwendet die Proxy-Indizes für source und target als Vertex-Labels.

Ich möchte die echten IDs verwenden, in meiner links Tabelle ausgedrückt als sourceID und targetID.

Also, für:

source target value sourceID targetID 
1  3  4 0.6245 1450552 1519842 

Dies würde zeigen, wie:

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

Statt:

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

(Beachten Sie, dass der Proxy-Indizes Null in den links Datenrahmen indiziert ist und ein im nodes indizierten Datenrahmen.Dieser Versatz um 1 ist notwendig für igraph Plotten).

Ich weiß, ich muss irgendwie match oder map die Proxy-Indizes ihre name im nodes Datenrahmen entspricht. Wie auch immer, ich bin ratlos, da ich die Reihenfolge, in der igraaph Etiketten aufträgt, nicht kenne.

Wie kann ich das erreichen?

Ich habe folgende Fragen vergeblich konsultiert:

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

Antwort

1

Sie die Etiketten wie folgt angeben:

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

Sie könnten auch bestehen

mit dem Vertices-Argument, wenn Sie die anderen Knotenattribute benötigen.

Daten:

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

Dank für Ihre Antwort danken . Sehr nützlich. Wenn du sagst "Du könntest ... zum Scheitelpunktargument übergehen" was genau meinst du? Willst du 'vertex.attr = merge ....' setzen? – Chuck

+0

Ich meinte 'graph.data.frame (..., vertices = merge (...))'. – lukeA

+0

Ausgezeichnet, sehr geschätzt. – Chuck

1

Die einfachste Lösung wäre, die Spalten von links neu zu ordnen, weil nach der Dokumentation:

„Wenn Eckpunkten NULL ist, dann werden die ersten beiden Spalten von d werden als symbolische Kantenliste und zusätzliche Spalten als Kantenattribute verwendet. "

Daher wird Ihr Code die korrekte Ausgabe geben nach dem Laufen:

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

Danke! Werde es ausprobieren. – Chuck

1

Es scheint, ich in der Lage war, die Antwort auf diese Frage umfunktionieren dies zu erreichen.

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

Der Schlüssel war die vertex.label Attribute innerhalb plot() und wählen Sie eine in Scheiben geschnittene Teilmenge von nodes$names zu verwenden.

Für unseren Index können wir die in igraph zurückgegebenen Standard-Etiketten automatisch verwenden. Um diese zu extrahieren, können Sie V(gg)$names eingeben.

Innerhalb plot(gg) können wir dann schreiben:

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 

Als Full-Code:

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) 

Mit den obigen Daten, dies gab:

enter image description here

Verwandte Themen