Correctly color vertices in R igraph

Salvador Dali picture Salvador Dali · Apr 14, 2013 · Viewed 32.6k times · Source

I am using igraph to color vertices

I have two CSV files answers and topology of the graph.

Answers: (this tells that players K and N answered correctly)

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

Topology: (representation of who is connected to whom)

  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

I wanted to build a graph using package IGraph and to color vertices in different colors depending of their correctness.

This is what I was able to achieve:

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

The problem is that in my output the colors are wrong:enter image description here

Here M and K are marked as correct, whereas it should be N and K. I think that the problem is because I am not specifying that Node should be related to Player, and I tried to achieve this, but with no success.

Are there any ideas how to achieve this?

Answer

Gabor Csardi picture Gabor Csardi · Apr 14, 2013

The easiest is to create the graph with all meta data included and then igraph takes care of the rest. E.g.

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

But, actually if you don't include each edge in both directions in your data table, then you don't even need to call simplify.