R igraph中正确着色顶点

19

我将使用igraph来给顶点着色。

我有两个CSV文件answers和topology,用于构建图。

Answers:(这说明玩家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。 我认为问题是因为我没有指定Node应该与Player相关联,尽管我试图做到这一点,但没有成功。
有什么想法可以解决这个问题吗?

我有一个类似的问题..如果在ifelse子句中,列表元素成员资格取代相等性作为布尔条件,语法会如何改变? - j9000
2个回答

29

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

绘图

实际上,如果您的数据表中不包含每个边的双向信息,那么您甚至不需要调用简化函数。


3
@SalvadorDali: 请查看 get.vertex.attributeV(g)$value 只是一种语法糖,它调用了 get.vertex.attribute - Gabor Csardi
当我执行此操作时,出现错误:“提供的颜色既不是数字也不是字符”。似乎找不到解决方案。 - fraxture

6
问题在于图形在简化后被排序,而答案向量没有。也许有一种更简单的方法,但我会先对答案表进行排序: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)

enter image description here


1
在调用 plot 之前,先“修复”布局,像这样:l <-layout.fruchterman.reingold(g)。然后,以下类似的绘图调用将保持布局不变:plot(g, layout=l, vertex.color=V(g)$color) - Pierre Lapointe
调用simplify后,定点的顺序与原始图形相同。顺序是任意的,在当前实现中,如果没有提供“vertices”参数,则对应于在边列表中出现的顶点顺序,并且对应于“vertices”中的顺序。 - Gabor Csardi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接