2013-04-14 14 views
8

Używam igraph do kolorowania wierzchołkówPoprawnie kolorowe wierzchołki w R igraph

Mam dwie odpowiedzi plików CSV i topologię wykresu.

Odpowiedzi: (Mówi to, że gracze K i N odpowiedział poprawnie)

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

Topologia: (reprezentacja, który jest podłączony do kogo)

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 

Chciałem zbudować wykres za pomocą pakietu IGraph i kolor wierzchołków w różnych kolorach w zależności od ich poprawności.

To co udało mi się osiągnąć:

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

Problemem jest to, że w moim wyjściu kolory są źle: enter image description here

Tutaj M i K są oznaczane jako prawidłowe, podczas gdy powinno być N i K. Myślę, że problem polega na tym, że nie precyzuję, że Węzeł powinien być powiązany z odtwarzaczem i próbowałem to osiągnąć, ale bez powodzenia.

Czy są jakieś pomysły, jak to osiągnąć?

Odpowiedz

13

najłatwiej jest stworzenie wykresu z meta zawarte wszystkie dane i następnie igraph trwa troska o resztę. Na przykład.

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

Ale faktycznie, jeśli nie zawierają każdą przewagę w obu kierunkach w tabeli danych, to nawet nie trzeba zadzwonić uprościć.

+2

@SalvadorDali: zobacz 'get.vertex.attribute',' V (g) $ value' to tylko cukier syntaktyczny, nazywa się 'get.vertex.attribute'. –

+0

Kiedy to zrobię, pojawia się błąd: "dostarczony kolor nie jest ani numeryczny ani charakter" .Nie wydaje się znaleźć solna. – fraxture

4

Problem polega na tym, że wykres jest sortowany po simplify, a wektor odpowiedzi nie jest. Może być łatwiejszy sposób, ale po prostu uporządkuję tabelę odpowiedzi: answers <-answers[order(answers[,1]),] przed ustawieniem V(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red").

Można zobaczyć, że wykres jest posortowana z get.data.frame(g, what="vertices")

Alternatywnie, można match nazwiska get.data.frame (zauważ, że tworzę g dwukrotnie. Z jakiegoś powodu, get.data.frame nie grać ładnie z 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

"Napraw" układ przed twoim wezwaniem do "spisku", tak jak to 'l <-layout.fruchterman.reingold (g)'. Wywołanie wykresu w następujący sposób sprawi, że układ pozostanie niezmieniony: 'plot (g, layout = l, vertex.color = V (g) $ color)' –

+0

Kolejność wierzchołków po wywołaniu 'uproszczenia' jest taka sama jak dla oryginalny wykres. Kolejność jest dowolna, w obecnej implementacji odpowiada kolejności, w jakiej wierzchołki pojawiają się na liście krawędzi, jeśli argument 'vertices' nie jest podany, a do kolejności w' vertices', jeśli jest. –

Powiązane problemy