2011-09-22 17 views
16

Rを使って5つのノードと20の有向枝(各2つのノードを結ぶ辺)でネットワークを描く必要がありますが、2つの機能が必要です。Rをネットワークに描く

  1. 各エッジの厚さを制御できるようにする。
  2. エッジが、私は解決策を探して時間を費やしてきた

(すなわち、Bにエッジ形AがAにBからエッジの上に描かれていない)の重複、および多くのパッケージを試してはなりませんしかし、常に問題があります。

誰でも解決策を提案し、可能な限り完全な例を提供できますか?

多くの方々のおかげです。

答えて

23

もし線が曲がっていれば、私は2つの方法を知っています。最初私はedgelistを作成する:

Edges <- data.frame(
    from = rep(1:5,each=5), 
    to = rep(1:5,times=5), 
    thickness = abs(rnorm(25))) 

Edges <- subset(Edges,from!=to) 

これは第三の第一列、第二に、宛先のノード及び重量における原点のノードを含みます。私のpacake qgraphを使って、これを使って重み付きグラフをプロットすることができます。しかし、このパッケージは本当に、この目的のために意図されていない、あなたは、エッジの色を変更(まだ、働いていないことができ

library("qgraph") 
qgraph(Edges,esize=5,gray=TRUE) 

qgraph

:2つのノード間の複数のエッジが存在する場合、デフォルトで縁が湾曲していますそれ:))。あなたはIGRAPHパッケージを使用することができ、より制御のために

qgraph(Edges,esize=5,gray=TRUE,minimum=0,cut=.Machine$double.xmin) 

:あなただけの小さなトリックを持つすべてのエッジが黒にすることができます。最初にグラフを作成します。

library("igraph") 
g <- graph.edgelist(as.matrix(Edges[,-3])) 

最初のノードが0なので、行列に変換して1を減算することに注意してください。次はレイアウトを定義します。

l <- layout.fruchterman.reingold(g) 

今、私たちはE()機能を備えたエッジパラメータの一部変更することができます。

# Define edge widths: 
E(g)$width <- Edges$thickness * 5 

# Define arrow widths: 
E(g)$arrow.width <- Edges$thickness * 5 

# Make edges curved: 
E(g)$curved <- 0.2 

をそして最後にグラフにプロット:

plot(g,layout=l) 

igraph

+0

ありがとう、2つのソリューションが動作しています。 しかし、今私は別の問題を発見しました。私は2つのネットワークを同じノード名で描画していますが、異なるエッジの太さで、同じノードが各ネットワークで異なる位置にあります。たとえば、第1ネットワークのnode1は左上に、第2ネットワークは上に描画されます。右。同じ場所にノードを配置する必要があるので、2つのネットワークを視覚的に比較するのは簡単です。あなたはこれを修正する方法を知っていますか? ありがとう – Pansy

+0

固定レイアウトを使用してノードの配置を手動で定義できます。 qgraphでは、これは以下のようにして行うことができます: 'L < - qgraph([arguments])$ layout'を使って1つのグラフのレイアウトを保存し、' qgraph([arguments]、layout = L) 'という別のグラフでそれを使用します。 igraphでは、既に上で示したように表記を保存して、2番目のグラフで再び使用することができます。 –

+0

なぜ 'g < - graph.edgelist(as.matrix(Edges [、 - 3] -1))'というコードを持つビットが 'Error in graph(t(el) 、directed = directed): at structure_generators.c:84:無効な(負の)頂点ID、無効な頂点ID'何が問題なのか? –

1

「ネットワーク」という名前のパッケージは、有向なネットワークをかなりよく描き、問題を処理することができます。これを行うためのより直接的な方法があるかもしれないが

ex.net <- rbind(c(0, 1, 1, 1), c(1, 0, 0, 1), c(0, 0, 0, 1), c(1, 0, 1, 0)) 

plot(network(ex.net), usecurve = T, edge.curve = 0.00001, 
    edge.lwd = c(4, rep(1, 7))) 

edge.curve引数は、非常に低く設定され、usecurveと組み合わせる場合= Tは、エッジを分離し、そしてedge.lwdは、そのようなベクターを取ることができます異なるサイズの引数。

いつも最も良い結果ではないと私は認めている。しかし、さまざまな方法でカスタマイズ可能なまともなネットワークプロットを取得するのはかなり簡単です(network.plotを参照)。

1

エッジ上の 'non overlapping'という制約は大きいですここの問題。まず、ネットワークは「平面」でなければなりません。そうでなければ、2次元では不可能です(3つの家をガス、電気、電話会社の建物にクロスオーバーなしで接続することはできません)。

平面グラフレイアウトのアルゴリズムは基本的に4色問題を解決すると思います。それを楽しんでください。ヒューリスティックスが存在し、平面グラフレイアウトを検索し、強制的に指向して読み込みます。Planar Graph Layouts

+0

OPは、2つのノード間のエッジがオーバーラップしてはならず、すべてのエッジではないことを意味していました。 –

+0

ああ、そうです。私はちょうど1つのエッジを描き、適切な端または端に矢頭を付けるだろう。ジョブは完了:) – Spacedman