web-dev-qa-db-ja.com

Rで大規模なネットワークを視覚化する方法は?

ネットワークの視覚化は、実際の科学では一般的になります。しかし、ネットワークの規模が拡大するにつれて、一般的な視覚化の有用性は低下します。単にノード/頂点とリンク/エッジが多すぎます。多くの場合、視覚化の努力は「ヘアボール」の作成に終わります。

この問題を克服するために、いくつかの新しいアプローチが提案されています、例えば:

私はもっ​​と多くのアプローチがあると確信しています。したがって、私の質問は次のとおりです:ヘアボールの問題を克服する方法、つまりRを使用して大規模なネットワークを視覚化する方法?

例示的なネットワークをシミュレートするコードを次に示します。

# Load packages
lapply(c("devtools", "sna", "intergraph", "igraph", "network"), install.packages)
library(devtools)
devtools::install_github(repo="ggally", username="ggobi")
lapply(c("sna", "intergraph", "GGally", "igraph", "network"), 
       require, character.only=T)

# Set up data
set.seed(123)
g <- barabasi.game(1000)

# Plot data
g.plot <- ggnet(g, mode = "fruchtermanreingold")
g.plot

enter image description here

この質問は GraphVizにとって大きすぎる無向グラフの視覚化? に関連しています。ただし、ここでは、一般的なソフトウェアの推奨事項ではなく、具体例(上記のデータを使用)を検索しています。これらの手法は、R(このスレッドの例: R:多すぎる点がある散布図 )。

54
majom

非常に大規模なネットワークを視覚化する別の方法は、ノードを表すためにポイントの代わりに水平線を使用するBioFabric(www.BioFabric.org)を使用することです。次に、垂直線分を使用してエッジが表示されます。この手法の簡単なD3デモは、 http://www.biofabric.org/gallery/pages/SuperQuickBioFabric.html に示されています。

BioFabricはJavaアプリケーションですが、単純なRバージョンは https://github.com/wjrl/RBioFabric で入手できます。

Rコードのスニペットを次に示します。

 # You need 'devtools':
 install.packages("devtools")
 library(devtools)

 # you need igraph:
 install.packages("igraph")
 library(igraph)

 # install and load 'RBioFabric' from GitHub
 install_github('RBioFabric',  username='wjrl')
 library(RBioFabric)

 #
 # This is the example provided in the question:
 #

 set.seed(123)
 bfGraph = barabasi.game(1000)

 # This example has 1000 nodes, just like the provided example, but it 
 # adds 6 edges in each step, making for an interesting shape; play
 # around with different values.

 # bfGraph = barabasi.game(1000, m=6, directed=FALSE)

 # Plot it up! For best results, make the PDF in the same
 # aspect ratio as the network, though a little extra height
 # covers the top labels. Given the size of the network,
 # a PDF width of 100 gives us good resolution.

 height <- vcount(bfGraph)
 width <- ecount(bfGraph)
 aspect <- height / width;
 plotWidth <- 100.0
 plotHeight <- plotWidth * (aspect * 1.2)
 pdf("myBioFabricOutput.pdf", width=plotWidth, height=plotHeight)
 bioFabric(bfGraph)
 dev.off()

質問者によって提供されたデータのBioFabricバージョンのショットを次に示しますが、m> 1の値で作成されたネットワークはより興味深いものです。挿入図の詳細には、ネットワークの左上隅の拡大図が示されています。ノードBF4はネットワーク内の最高次のノードであり、デフォルトのレイアウトはそのノードから始まるネットワークの幅優先探索(エッジ方向を無視)であり、隣接ノードはノード次数の降順で走査されます。たとえば、ノードBF4の近隣の約60%が次数1であることがすぐにわかることに注意してください。厳密な45度の低いエッジから、この1000ノードのネットワークには999のエッジがあり、したがってツリーであることがわかります。

BioFabric presentation of example data

完全な開示:BioFabricは私が書いたツールです。

16
wjrl

これは興味深い質問です。リストしたツールのほとんどを知りませんでした。ありがとう。リストに HivePlot を追加できます。これは、固定数の軸(通常は2または3)にノードを投影する決定論的な方法です。リンクされたページを見てください。多くの視覚的な例があります。

enter image description here

データセットにカテゴリノード属性がある場合、ノードがどの軸に行くかを選択するために使用できるようになります。たとえば、大学のソーシャルネットワークを学習する場合、ある軸に学生、別の軸に教師、3番目に管理スタッフがいます。しかし、もちろん、離散化された数値属性(たとえば、それぞれの軸上の若い人、中年の人、年配の人)でも機能します。

次に、別の属性が必要になりますが、今回は数値(または少なくとも順序)でなければなりません。軸上のノードの位置を決定するために使用されます。また、次数や推移性(クラスタリング係数)などのトポロジメジャーを使用することもできます。

ハイブプロットの作成方法http://www.hiveplot.net/img/hiveplot-undirected-01.png

このメソッドが決定論的であるという事実は興味深いものです。なぜなら、異なる(しかし比較可能な)システムを表す異なるネットワークを比較できるからです。たとえば、2つの大学を比較できます(同じ属性/尺度を使用して軸と位置を決定する場合)。また、属性/メジャーの異なる組み合わせを選択して視覚化を生成することにより、同じネットワークをさまざまな方法で記述することができます。これは、いわゆるHiveパネルのおかげで、実際にネットワークを視覚化する推奨される方法です。

これらのHiveプロットを生成できるいくつかのソフトウェアは、Java and R.

10
Vincent Labatut

私は最近この問題に取り組んできました。その結果、私は別の解決策を思いつきました。コミュニティ/クラスターごとにグラフを折りたたみます。このアプローチは、上記のOPで概説されている3番目のオプションに似ています。警告の言葉として、このアプローチは無向グラフで最適に機能します。例えば:

library(igraph)

set.seed(123)
g <- barabasi.game(1000) %>%
  as.undirected()

#Choose your favorite algorithm to find communities.  The algorithm below is great for large networks but only works with undirected graphs
c_g <- fastgreedy.community(g)

#Collapse the graph by communities.  This insight is due to this post http://stackoverflow.com/questions/35000554/collapsing-graph-by-clusters-in-igraph/35000823#35000823

res_g <- simplify(contract(g, membership(c_g))) 

このプロセスの結果は次の図になります。頂点の名前はコミュニティのメンバーシップを表しています。

plot(g, margin = -.5)

enter image description here

上記はこの恐ろしい混乱よりも明らかにいいです

plot(r_g, margin = -.5)

enter image description here

コミュニティを元の頂点にリンクするには、次のようなものが必要です。

mem <- data.frame(vertices = 1:vcount(g), memeber = as.numeric(membership(c_g)))

IMOこれは、2つの理由で素晴らしいアプローチです。まず、理論的にはあらゆるサイズのグラフに対応できます。コミュニティを見つけるプロセスは、折りたたまれたグラフで継続的に繰り返すことができます。第二に、インタラクティブなアプローチを採用すると、非常に読みやすい結果が得られます。たとえば、折りたたまれたグラフの頂点をクリックして、そのコミュニティを展開し、元の頂点をすべて表示できるユーザーを想像できます。

7
Jacob H

さらに別の興味深いパッケージは networkD です。このライブラリ内でグラフを表す無数の手段があります。特に、forceNetworkは興味深いオプションです。インタラクティブであるため、ネットワークを実際に探索できます。 EDAには最適ですが、最終的な作業にはあまりにも「ぐにゃぐにゃ」です。

3
Jacob H

私は周りを見て、良い解決策を見つけませんでした。私のアプローチは、ノードを削除し、Edgeの透明度で遊ぶことでした。それは技術的なものというよりはむしろ設計ソリューションですが、ラップトップでそれほど複雑にすることなく、最大50,000エッジのgephiのようなネットワークをプロットすることができました。

あなたの例で:

plot(simplify(g), vertex.size= 0.01,Edge.arrow.size=0.001,vertex.label.cex = 0.75,vertex.label.color = "black"  ,vertex.frame.color = adjustcolor("white", alpha.f = 0),vertex.color = adjustcolor("white", alpha.f = 0),Edge.color=adjustcolor(1, alpha.f = 0.15),display.isolates=FALSE,vertex.label=ifelse(page_rank(g)$vector > 0.1 , "important nodes", NA))

enter image description here

Twitterの例では、30,000のエッジを持つネットワークに言及しています。

enter image description here

0
supercontra