简体   繁体   中英

Correctly color vertices in 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: 在此输入图像描述

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 easiest is to create the graph with all meta data included and then igraph takes care of the rest. Eg

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)

在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM