web-dev-qa-db-ja.com

R igraphの頂点に正しく色を付ける

Igraphを使用して頂点に色を付けています

2つの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がプレーヤーに関連している必要があることを指定していないためです。これですが、成功しませんでした。

これを達成する方法はありますか?

14
Salvador Dali

最も簡単なのは、すべてのメタデータを含めてグラフを作成し、残りを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

ただし、実際には、データテーブルの両方向に各エッジを含めない場合は、単純化を呼び出す必要すらありません。

20
Gabor Csardi

問題は、グラフがsimplifyの後にソートされ、回答ベクトルがそうでないことです。もっと簡単な方法があるかもしれませんが、answers <-answers[order(answers[,1]),]を設定する前に、回答テーブルV(g)$color <- ifelse(answers[V(g), 2] == 1, "blue", "red")をソートするだけです。

グラフがget.data.frame(g, what="vertices")でソートされていることがわかります

または、match the get.data.frame名前(gを2回作成することに注意してください。何らかの理由でget.data.framesimplifyとうまく連携しません。

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

5
Pierre Lapointe