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)
問題は、私の出力で色が間違っていることです:
ここでは、MとKは正しいとマークされていますが、NとKである必要があります。問題は、Nodeがプレーヤーに関連している必要があることを指定していないためです。これですが、成功しませんでした。
これを達成する方法はありますか?
最も簡単なのは、すべてのメタデータを含めてグラフを作成し、残りを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)
ただし、実際には、データテーブルの両方向に各エッジを含めない場合は、単純化を呼び出す必要すらありません。
問題は、グラフが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.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)