Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correctly color vertices in R igraph

Tags:

r

igraph

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?

like image 812
Salvador Dali Avatar asked Apr 14 '13 13:04

Salvador Dali


People also ask

How do I download an Igraph package in R?

The simplest way to install the igraph R package is typing install. packages("igraph") in your R session. If you want to download the package manually, the following link leads you to the page of the latest release on CRAN where you can pick the appropriate source or binary distribution yourself.


2 Answers

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.

like image 126
Gabor Csardi Avatar answered Oct 02 '22 14:10

Gabor Csardi


The problem is that the graph is sorted after simplify and the answers vector is not. There might be an easier way, but I would simply sort your answers table: answers <-answers[order(answers[,1]),] before setting V(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red").

You can see that your graph is sorted with get.data.frame(g, what="vertices")

Alternatively, you could match the get.data.frame names (note that I create g twice. For some reason, get.data.frame doesn't play nicely with 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

like image 38
Pierre Lapointe Avatar answered Oct 02 '22 14:10

Pierre Lapointe