web-dev-qa-db-ja.com

固定位置でigraphプロットレイアウトを制御する方法は?

フロー図に似たネットワークの視覚化を描画しようとしています。私は次のコードにかなり近いですが、いくつか質問があります。

  1. これは最良のlayout()アルゴリズムですか、それとも各ノードに手動で位置を割り当てることができますか>
  2. これらのノードがプロットでオーバーラップしないようにするにはどうすればよいですか(ここでのように)?
  3. 1つのノードを「アンカー」または開始点として割り当てることはできますか?つまり、「C」を一番上または一番左のノードにすることはできますか?

本当にありがとう!!

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)
27
david h

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))
_
38
Sacha Epskamp

自分でノードの場所を割り当てたい場合は、上記よりも簡単な方法で、データシートに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)

enter image description here

8
unknown