2013-04-14 3 views
8

Я использую igraph для цветных вершинПравильно окрашенные вершины в R igraph

У меня есть два файла CSV-файлов и топология графика.

Ответы: (это говорит о том, что игроки 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, и я пытался достичь этого, но без успеха.

Есть ли идеи, как достичь этого?

ответ

13

Проще всего создать график с включенными все мета-данные, а затем 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) 

plot

Но, на самом деле, если вы не включают каждое ребро в обоих направлениях в таблице данных, то вам не нужно даже назвать упрощать.

+2

@SalvadorDali: см. 'Get.vertex.attribute',' V (g) $ value' - это просто синтаксический сахар, он вызывает 'get.vertex.attribute'. –

+0

Когда я делаю это, я получаю сообщение об ошибке: «цвет поставки не является ни числовым, ни символом». Кажется, что не нашел soln. – fraxture

4

Проблема в том, что график сортируется после simplify, а вектор ответов - нет. Возможно, будет более простой способ, но я бы просто отсортировал ваши таблицы ответов: 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.frame не дружат с 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

+1

«Исправить» макет перед вызовом 'plot', как этот' l <-layout.fruchterman.reingold (g) '. После этого график, следующий ниже, сохранит макет без изменений: 'plot (g, layout = l, vertex.color = V (g) $ color)' –

+0

Порядок вершин после вызова 'simplify' такой же, как для исходный граф. И порядок произволен, в текущей реализации он соответствует порядку, так как вершины отображаются в списке ребер, если аргумент 'vertices' не задан, а порядок в' вершинах', если он есть. –

Смежные вопросы