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:
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?
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.
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)
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With