2013-04-14 52 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'中的顺序,如果是。 –