16

我正在使用 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)  

问题是在我的输出中颜色是错误的:在此处输入图像描述

这里 M 和 K 被标记为正确,而它应该是 N 和 K。我认为问题在于我没有指定 Node 应该与 Player 相关,并且我试图实现这一点,但没有成功。

有什么想法可以实现这一目标吗?

4

2 回答 2

26

最简单的方法是创建包含所有元数据的图形,然后 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)

阴谋

但是,实际上如果您没有在数据表中包含两个方向的每条边,那么您甚至不需要调用简化。

于 2013-04-14T21:17:55.760 回答
6

问题是图形是在之后排序的,simplify而答案向量不是。可能有一种更简单的方法,但我会简单地对您的答案表进行排序:answers <-answers[order(answers[,1]),]在设置V(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red").

您可以看到您的图表已排序get.data.frame(g, what="vertices")

或者,您可以match使用get.data.frame名称(请注意,我创建g了两次。出于某种原因,get.data.framesimplify.

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)

在此处输入图像描述

于 2013-04-14T14:35:03.400 回答