2013-04-14 3 views
8

Ich verwende iigraph zum Einfärben von ScheitelpunktenKorrekte Farbscheitelpunkte in R igraph

Ich habe zwei CSV-Dateien Antworten und Topologie des Graphen.

Antworten: (dies sagt, dass die Spieler K und N richtig beantwortet)

Player Q1_I1 
1  k  1 
2  l  0 
3  n  1 
4  m  0 

Topologie: (Darstellung, wer mit wem verbunden ist)

Node.1 Node.2 
1  k  l 
2  l  k 
3  l  m 
4  m  l 
5  l  n 
6  n  l 
7  n  k 
8  k  n 

Ich wollte ein Diagramm bauen Paket mit IGraph und um Vertices in verschiedenen Farben zu färben, abhängig von ihrer Korrektheit.

Dies ist, was ich in der Lage war, zu erreichen: sind enter image description here

Hier M und K markiert als richtig, während es sein sollte: in meiner Ausgabe der Farben sind falsch

# reads answers and creates a graph from topology 
answers <- read.csv("answers2.csv",header=T) 
data<-read.csv('edges2.csv') 
data<-graph.data.frame(data1, directed=FALSE) 
g<-simplify(data) 

# goes through vertices and colors them in different color, depending on correctness. 
# 2 means second column (First one is the players name) 
V(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red") 
plot(g, layout=layout.fruchterman.reingold, vertex.color=V(g)$color) 

Das Problem ist, dass N und K. Ich denke, dass das Problem ist, weil ich nicht festlege, dass Knoten mit Spieler verbunden sein sollte, und ich habe versucht, dies zu erreichen, aber mit keinem Erfolg.

Gibt es Ideen, wie dies zu erreichen ist?

Antwort

13

die einfachste ist die Grafik erstellen mit allen Metadaten enthalten und dann IGRAPH nimmt Sorge für den Rest. Z.B.

library(igraph) 

answers <- read.table(textConnection(
    " Player Q1_I1                
    1  k  1                
    2  l  0                
    3  n  1                
    4  m  0                
")) 

topology <- read.table(textConnection(
    " Node.1 Node.2                
    1  k  l                
    2  l  k                
    3  l  m                
    4  m  l                
    5  l  n                
    6  n  l                
    7  n  k                
    8  k  n                
")) 

g2 <- graph.data.frame(topology, vertices=answers, directed=FALSE) 
g <- simplify(g2) 
V(g)$color <- ifelse(V(g)$Q1_I1 == 1, "lightblue", "orange") 

plot(g) 

plot

Aber, wenn Sie tatsächlich in Ihrer Datentabelle in beiden Richtungen nicht jede Kante sind, dann müssen Sie nicht einmal vereinfachen nennen.

+2

@SalvadorDali: siehe 'get.vertex.attribute',' V (g) $ value' ist nur ein syntaktischer Zucker, er ruft 'get.vertex.attribute' auf. –

+0

Wenn ich dies tue, erhalte ich einen Fehler: 'gelieferte Farbe ist weder numerisch noch Zeichen ". Kann nicht scheinen, ein soln zu finden. – fraxture

4

Das Problem ist, dass der Graph nach simplify sortiert ist und der Antwortvektor nicht ist. Es könnte ein einfacher Weg sein, aber ich würde einfach Ihre Antworten Tabelle sortieren: answers <-answers[order(answers[,1]),] vor der Einstellung V(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red").

Sie können sehen, dass Ihr Diagramm mit get.data.frame(g, what="vertices")

Alternativ sortiert ist, können Sie die get.data.frame Namen match (beachten Sie, dass ich g zweimal erstellen. Aus irgendeinem Grund get.data.frame spielt nicht schön mit simplify.

answers <- read.csv("c:/answers2.csv",header=T) 
data1<-read.csv('c:/edges2.csv') 
data2<-graph.data.frame(data1, directed=FALSE) 
g<-simplify(data2) 
ordered.vertices <-get.data.frame(g, what="vertices") 
g<-simplify(data2) 
V(g)$color <- ifelse(answers[match(answers[,1],ordered.vertices$name), 2] == 1, "blue", "red") 
plot(g, layout=layout.fruchterman.reingold, vertex.color=V(g)$color) 

enter image description here

+1

"Fix" das Layout vor dem Aufruf zu "plotten" wie diese 'l <-layout.fruchterman.reingold (g)'. Ein Plotaufruf wie folgt wird dann das Layout unverändert lassen: 'plot (g, layout = l, vertex.color = V (g) $ color)' –

+0

Die Reihenfolge der Scheitelpunkte nach dem Aufruf von 'simplify' ist dieselbe wie für das ursprüngliche Diagramm. Und die Reihenfolge ist willkürlich, in der aktuellen Implementierung entspricht sie der Ordnung, wie die Scheitelpunkte in der Kantenliste angezeigt werden, wenn das "Vertices" -Argument nicht gegeben ist, und der Ordnung in "Scheitelpunkten", wenn dies der Fall ist. –