web-dev-qa-db-ja.com

igraphで重複しないエッジを取得するには、どのレイアウトを使用する必要がありますか?

ツリーのようなデータを使用してグラフを作成しようとしています。通常、ノードは2つ以上のエッジに分割されます。さまざまなレイアウトを試しましたが、layout.reingold.tilfordパラメーターは、分岐しないデータを含むツリー状のグラフを生成することがわかります。ただし、出力は特に魅力的ではありません。これらはより放射状の構造を生成するため、私はむしろlayout.lglまたはlayout.kamada.kawaiのようなものを使用します。ただし、これらのツリーにエッジが重ならないようにRのパラメーターを変更する方法はわかりません。これは可能ですか?

355個のノードと354個のエッジを持つ、Pajek形式の単純なデータファイルをインポートしました。現在、以下を使用して印刷しています:

plot.igraph(g,vertex.size=3,vertex.label=NA,layout=layout.lgl)

これにより、このような出力が得られます。これは素晴らしいですが、エッジが重複しています。 tkplot、またはcytoscapeのような別のプログラムを使用してこれを手動で修正できることを読みましたが、構築するこれらのかなりの数があり、それらのサイズは手動修正を面倒にします。

どうもありがとう。 Here is an example of the output I get

28

layout.reingold.tilfordにはcircularというパラメーターがあります。これをTRUEに設定すると、X座標を角度として(適切な再スケーリング後)、Y座標を半径として扱うことにより、最終レイアウトを放射状レイアウトに変換します。皮肉なことに、これは最終的にエッジの交差がないことを保証するものではありませんが、グラフの残りの部分に比べてサブツリーがあまり広くない場合はうまく機能します:

> g <- barabasi.game(100, directed=F)
> layout <- layout.reingold.tilford(g, circular=T)
> plot(g, layout=layout)
13
Tamás

コメントを追加したいだけですが、担当者が低すぎます。 @bdemarestが投稿したメソッドは、igraphバージョン> 0.7では機能しません。新しいバージョンはareaパラメーターをサポートしていないため、同じ効果を得ることができません。古いバージョンをビルドするのに時間がかかりましたので、私はいくつかの洞察を共有したいと思います。 igraph nightly builds からダウンロードすると、ソースからigraph 0.7を手動でインストールできます。私のマシン(Mac OS 10.10)では、gfortranが原因でビルドに問題が発生したため、問題を解決する このリンク が見つかりました。 Rで同様のグラフを作成したい人に役立つことを願っています。

19
morphe

layout.fruchterman.reingold()を試してください。エッジが交差するのを防ぐ良い仕事をしているようです。 @Tamásによって提案された355ノードバージョンのバラバシグラフでテストしました。

library(igraph)

g = barabasi.game(355, directed=FALSE)

png("plot1.png", height=6, width=12, units="in", res=200)
par(mfrow=c(1, 2))

plot.igraph(g,vertex.size=3,vertex.label=NA,
    layout=layout.fruchterman.reingold(g, niter=10000))
mtext("layout.fruchterman.reingold, area = vcount^2", side=1)

plot.igraph(g,vertex.size=3,vertex.label=NA,
    layout=layout.fruchterman.reingold(g, niter=10000, area=30*vcount(g)^2))
mtext("layout.fruchterman.reingold, area = 30 * vcount^2", side=1)

dev.off()

enter image description here

18
bdemarest