web-dev-qa-db-ja.com

重み付き隣接行列を作成するigraph

私はigraphパッケージを使用して(スパース)加重グラフを描画しようとしています。現在、隣接行列がありますが、graph.adjacency関数でエッジの重みを認識できません。

次のランダム対称行列を考えてみます。

m <- read.table(row.names=1, header=TRUE, text=
"           A          B          C          D           E         F
A 0.00000000  0.0000000  0.0000000  0.0000000  0.05119703 1.3431599
B 0.00000000  0.0000000 -0.6088082  0.4016954  0.00000000 0.6132168
C 0.00000000 -0.6088082  0.0000000  0.0000000 -0.63295415 0.0000000
D 0.00000000  0.4016954  0.0000000  0.0000000 -0.29831267 0.0000000
E 0.05119703  0.0000000 -0.6329541 -0.2983127  0.00000000 0.1562458
F 1.34315990  0.6132168  0.0000000  0.0000000  0.15624584 0.0000000")
m <- as.matrix(m)

プロットするには、まずこの隣接行列を適切なigraph形式に変換する必要があります。 graph.adjacencyを使用すると、これは比較的単純になります。 graph.adjacency のドキュメントを読んだことによると、私は次のことを行う必要があります:

library(igraph)
ig <- graph.adjacency(m, mode="undirected", weighted=TRUE)

ただし、エッジの重みは認識されません。

str(ig)
# IGRAPH UNW- 6 8 -- 
# + attr: name (v/c), weight (e/n)
# + edges (vertex names):
# [1] A--E A--F B--C B--D B--F C--E D--E E--F
plot(ig)

enter image description here

IgraphにEdgeの重みを認識させるにはどうすればよいですか?

17
Scott Ritchie

重みはそこにあり、weight (e/n)は重みと呼ばれるEdge属性があり、それが数値であることを意味します。見る ?print.igraph。ただし、デフォルトではプロットされないため、Edge.labelとして追加する必要があります。

plot(ig, Edge.label=round(E(ig)$weight, 3))

graph plot screenshot

プロットする場合は、必ず?igraph.plotting

27
Gabor Csardi

@TWLのソリューションは、負の重みを含む重みの関数としてエッジの幅を表すように簡単に一般化できます。トリックは、最小の重みの値(およびオプションで最小の重みの幅を表すオフセット)を合計することによってすべての重みを変換することです。例えば:

# reproducible example:
set.seed(12345)
a <- matrix(runif(5*5, min=-10, max=10), ncol=5)
diag(a) <- 0 # remove loops.
>a
           [,1]       [,2]      [,3]       [,4]       [,5]
[1,]  0.0000000 -6.6725643 -9.309291 -0.7501069 -0.9254385
[2,]  7.5154639  0.0000000 -6.952530 -2.2371204 -3.4649518
[3,]  5.2196466  0.1844867  0.000000 -1.9502972  9.3083065
[4,]  7.7224913  4.5541051 -9.977268  0.0000000  4.1496375
[5,] -0.8703808  9.7947388 -2.175933  9.0331751  0.0000000

# create igraph object.
g <- graph.adjacency(a, mode="undirected", weighted=TRUE)
plot(g)

# assign Edge's width as a function of weights.
E(g)$width <- E(g)$weight + min(E(g)$weight) + 1 # offset=1
plot(g)

enter image description here

9
ddiez

私がigraphを愛しているのと同じくらい、qgraphパッケージは加重ネットワークをプロットする方が簡単だとわかりました。

隣接行列では、qgraphライブラリのqgraph()を使用してプロットすることもできます。ネガティブエッジは自動的に赤、ポジティブエッジは緑に色付けされます。

install.packages('qgraph')
require(qgraph)
qgraph(m)
qgraph(m,Edge.labels=TRUE)  #if you want the weights on the edges as well

qgraphはigraph上に構築されていますが、あなたのためにすべてを行います。

8
James Tobin

E(ig)$weightを使用してエッジの重みを抽出し、プロット関数の_Edge.width_引数に割り当てることができます。

plot(ig, Edge.width=E(ig)$weight)

参考のために_?igraph.plotting_ [ link ]を参照してください。

また、この例では、重みはエッジのwidthに対応するため、_>= 0_である必要があることに注意してください。

4
TWL