2013-04-14 19 views
8

sto usando IGRAPH a vertici colorevertici correttamente a colori in R IGRAPH

Ho due file risposte e topologia del grafico CSV.

Risposte: (Questo indica che i giocatori K e N risposto correttamente)

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

Topology: (rappresentazione di chi è connesso a chi)

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 

ho voluto costruire un grafico utilizzando il pacchetto IGraph e per colorare i vertici in diversi colori a seconda della loro correttezza.

Questo è ciò che sono stato in grado di realizzare:

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

Il problema è che nella mia uscita i colori sono sbagliati: enter image description here

Qui M e K sono contrassegnati come corretta, mentre dovrebbe essere N e K. Penso che il problema sia perché non sto specificando che il Nodo debba essere collegato a Player, e ho cercato di ottenerlo, ma senza successo.

Ci sono idee su come raggiungere questo obiettivo?

risposta

13

il metodo più semplice è quello di creare il grafico con tutti i metadati inclusi e poi prende IGRAPH cura del resto. Per esempio.

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

Ma, in realtà se non si include ogni bordo in entrambe le direzioni nella vostra tabella di dati, quindi non è nemmeno bisogno di chiamare semplificare.

+2

@SalvadorDali: vedi 'get.vertex.attribute',' V (g) $ value' è solo uno zucchero sintattico, chiama 'get.vertex.attribute'. –

+0

Quando faccio questo ottengo un errore: 'il colore fornito non è né numerico né carattere. "Non riesco a trovare un soln. – fraxture

4

Il problema è che il grafico è ordinato dopo simplify e il vettore di risposte non lo è. Potrebbe esserci un modo più semplice, ma vorrei semplicemente ordinare la tabella delle risposte: answers <-answers[order(answers[,1]),] prima di impostare V(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red").

Si può vedere che il grafico è ordinato con get.data.frame(g, what="vertices")

In alternativa, si potrebbe match i get.data.frame nomi (notare che io creo g due volte. Per qualche ragione, get.data.frame non gioca bene con 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

"Correggere" il layout prima della chiamata a 'plot' come questo' l <-layout.fruchterman.reingold (g) '. Una chiamata alla trama come la seguente manterrà il layout invariato: 'trama (g, layout = l, vertex.color = V (g) $ color)' –

+0

L'ordine dei vertici dopo aver chiamato 'simplify' è lo stesso che per il grafico originale. E l'ordine è arbitrario, nell'implementazione corrente corrisponde all'ordine in quanto i vertici vengono visualizzati nell'elenco dei bordi, se l'argomento 'vertices' non è dato, e all'ordine in' vertices', se lo è. –

Problemi correlati