2013-04-14 154 views
8

我使用igraph顏色頂點正確顏色頂點R igraph

我有兩個CSV文件的答案和拓撲圖。

答案:(這告訴玩家k和n正確回答)

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

拓撲結構:(誰連接到誰的表現)

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 

我想建立使用包圖IGraph並根據其正確性爲不同顏色的頂點着色。

這是我能夠做到:

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

的問題是,在我的輸出顏色是錯誤的:enter image description here

這裏M和K的標記爲正確的,而應該是N和K. 我認爲問題是因爲我沒有指定該節點應該與播放器相關,並且我試圖實現這一點,但沒有成功。

有沒有什麼想法如何實現這一目標?

回答

13

最簡單的是創建圖形與包括所有的元數據,然後取的igraph其餘的照顧。例如。

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

但是,實際上,如果你不包括在你的數據表中兩個方向的每個邊緣,那麼你甚至不需要調用簡化。

+2

@SalvadorDali:參見'get.vertex.attribute','V(g)$ value'只是一個語法糖,它調用'get.vertex.attribute'。 –

+0

當我這樣做時,我得到一個錯誤:'提供的顏色既不是數字也不是字符'。似乎無法找到soln。 – fraxture

4

問題是圖表排序後simplify和答案向量不是。 可能有一個更簡單的方法,但我會簡單地排序你的答案表:answers <-answers[order(answers[,1]),]之前設置V(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red")

你可以看到你的圖形與get.data.frame(g, what="vertices")

或者排序,你可以matchget.data.frame名稱(請注意,我創建g兩次。出於某種原因,get.data.frame不能很好地與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

在您調用'plot'之前,像這樣'l <-layout.fruchterman.reingold(g)'調整佈局。如下所示的調用將保持佈局不變:'plot(g,layout = 1,vertex.color = V(g)$ color)' –

+0

調用'simplify'後的頂點順序與原始圖。順序是任意的,在當前的實現中,它對應於頂點出現在邊界列表中的順序,如果沒有給出'vertices'參數,並且是'vertices'中的順序,如果是。 –