フロー図に似たネットワークの視覚化を描画しようとしています。私は次のコードにかなり近いですが、いくつか質問があります。
本当にありがとう!!
library("igraph")
L3 <- LETTERS[1:8]
d <- data.frame(start = sample(L3, 16, replace = T), end = sample(L3, 16, replace = T),
weight = c(20,40,20,30,50,60,20,30,20,40,20,30,50,60,20,30))
g <- graph.data.frame(d, directed = T)
V(g)$name
E(g)$weight
ideg <- degree(g, mode = "in", loops = F)
col=Rainbow(12) # For Edge colors
plot.igraph(g,
vertex.label = V(g)$name, vertex.label.color = "gray20",
vertex.size = ideg*25 + 40, vertex.size2 = 30,
vertex.color = "gray90", vertex.frame.color = "gray20",
vertex.shape = "rectangle",
Edge.arrow.size=0.5, Edge.color=col, Edge.width = E(g)$weight / 10,
Edge.curved = T,
layout = layout.reingold.tilford)
Igraphのレイアウトは、ノードごとに2つの列と1つの行を持つマトリックスで定義されます。最初の列はそのx位置を示し、2番目の列はそのy位置を示し、スケールは関係ありません(常に、-1対1のプロット領域に合うように再スケーリングされます。グラフのレイアウト関数を呼び出すだけで、プロットする前にこのレイアウトを取得できます。 :
_ l <-layout.reingold.tilford(g)
l
[,1] [,2]
[1,] 0 0
[2,] -1 3
[3,] 0 1
[4,] 0 3
[5,] 0 2
[6,] 0 4
[7,] 1 3
_
このようにして、手動で任意の方法で変更し、プロットに送信できます。
_plot.igraph(g,
vertex.label = V(g)$name, vertex.label.color = "gray20",
vertex.size = ideg*25 + 40, vertex.size2 = 30,
vertex.color = "gray90", vertex.frame.color = "gray20",
vertex.shape = "rectangle",
Edge.arrow.size=0.5, Edge.color=col, Edge.width = E(g)$weight / 10,
Edge.curved = T,
layout = l)
_
また、引数params
を設定してレイアウトビットを制御できるようです。これは、グラフのルートを設定するために明らかに使用できる引数root
を含むリストです。これにノードの番号を割り当てます(igraphがノードのインデックスのようにCを使用することを忘れないでください、最初のインデックスは0です)。したがって、ルートを「C」に設定します。
_l <- layout.reingold.tilford(g,params=list(root=2))
_
編集:また、RGraphViz
には、チェックする価値のある素敵なツリーレイアウトがいくつかあります。
編集2:
これは、私のパッケージのソースコードの変更されたスニペットであり、同じ種類のレイアウトマトリックスを使用して、グラフ内のノードの配置を定義します。
_gridLayout <- function(x)
{
LmatX <- seq(-1,1,length=ncol(x))
LmatY <- seq(1,-1,length=nrow(x))
loc <- t(sapply(1:max(x),function(y)which(x==y,arr.ind=T)))
layout <- cbind(LmatX[loc[,2]],LmatY[loc[,1]])
return(layout)
}
_
この関数が行うことは、グリッド内のレイアウトを指定する行列(layout()
と同様)を、x位置とy位置を持つ2列のレイアウトに変換することです。ゼロの行列を定義し、ノードごとに1からノードの総数までの整数(これはigraph ID + 1です)。
たとえば、ばかげた4ノードグラフの場合:
_grid <- matrix(c(
0,0,1,0,0,
2,0,3,0,4),nrow=2,byrow=TRUE)
library("igraph")
g <- graph.adjacency(matrix(1,4,4))
plot(g,layout=gridLayout(L))
_
自分でノードの場所を割り当てたい場合は、上記よりも簡単な方法で、データシートにxとyのラベルが付いた列を追加し、それらの列のそれぞれのノードのx座標とy座標を使用します。例えば.
library('igraph')
nodes <- c('a','b','c','d')
x <- c(0,1,2,3)
y <- c(0,1,2,3)
from <- c('a','b','c')
to <- c('b','c','d')
NodeList <- data.frame(nodes, x ,y)
EdgeList <- data.frame(from, to)
a<- graph_from_data_frame(vertices = NodeList, d= EdgeList, directed = FALSE)
plot(a)