ネットワークの視覚化は、実際の科学では一般的になります。しかし、ネットワークの規模が拡大するにつれて、一般的な視覚化の有用性は低下します。単にノード/頂点とリンク/エッジが多すぎます。多くの場合、視覚化の努力は「ヘアボール」の作成に終わります。
この問題を克服するために、いくつかの新しいアプローチが提案されています、例えば:
私はもっと多くのアプローチがあると確信しています。したがって、私の質問は次のとおりです:ヘアボールの問題を克服する方法、つまり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
この質問は GraphVizにとって大きすぎる無向グラフの視覚化? に関連しています。ただし、ここでは、一般的なソフトウェアの推奨事項ではなく、具体例(上記のデータを使用)を検索しています。これらの手法は、R(このスレッドの例: R:多すぎる点がある散布図 )。
非常に大規模なネットワークを視覚化する別の方法は、ノードを表すためにポイントの代わりに水平線を使用する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は私が書いたツールです。
これは興味深い質問です。リストしたツールのほとんどを知りませんでした。ありがとう。リストに HivePlot を追加できます。これは、固定数の軸(通常は2または3)にノードを投影する決定論的な方法です。リンクされたページを見てください。多くの視覚的な例があります。
データセットにカテゴリノード属性がある場合、ノードがどの軸に行くかを選択するために使用できるようになります。たとえば、大学のソーシャルネットワークを学習する場合、ある軸に学生、別の軸に教師、3番目に管理スタッフがいます。しかし、もちろん、離散化された数値属性(たとえば、それぞれの軸上の若い人、中年の人、年配の人)でも機能します。
次に、別の属性が必要になりますが、今回は数値(または少なくとも順序)でなければなりません。軸上のノードの位置を決定するために使用されます。また、次数や推移性(クラスタリング係数)などのトポロジメジャーを使用することもできます。
ハイブプロットの作成方法http://www.hiveplot.net/img/hiveplot-undirected-01.png
このメソッドが決定論的であるという事実は興味深いものです。なぜなら、異なる(しかし比較可能な)システムを表す異なるネットワークを比較できるからです。たとえば、2つの大学を比較できます(同じ属性/尺度を使用して軸と位置を決定する場合)。また、属性/メジャーの異なる組み合わせを選択して視覚化を生成することにより、同じネットワークをさまざまな方法で記述することができます。これは、いわゆるHiveパネルのおかげで、実際にネットワークを視覚化する推奨される方法です。
これらのHiveプロットを生成できるいくつかのソフトウェアは、Java and R.
私は最近この問題に取り組んできました。その結果、私は別の解決策を思いつきました。コミュニティ/クラスターごとにグラフを折りたたみます。このアプローチは、上記の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)
上記はこの恐ろしい混乱よりも明らかにいいです
plot(r_g, margin = -.5)
コミュニティを元の頂点にリンクするには、次のようなものが必要です。
mem <- data.frame(vertices = 1:vcount(g), memeber = as.numeric(membership(c_g)))
IMOこれは、2つの理由で素晴らしいアプローチです。まず、理論的にはあらゆるサイズのグラフに対応できます。コミュニティを見つけるプロセスは、折りたたまれたグラフで継続的に繰り返すことができます。第二に、インタラクティブなアプローチを採用すると、非常に読みやすい結果が得られます。たとえば、折りたたまれたグラフの頂点をクリックして、そのコミュニティを展開し、元の頂点をすべて表示できるユーザーを想像できます。
さらに別の興味深いパッケージは networkD です。このライブラリ内でグラフを表す無数の手段があります。特に、forceNetwork
は興味深いオプションです。インタラクティブであるため、ネットワークを実際に探索できます。 EDAには最適ですが、最終的な作業にはあまりにも「ぐにゃぐにゃ」です。
私は周りを見て、良い解決策を見つけませんでした。私のアプローチは、ノードを削除し、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))
Twitterの例では、30,000のエッジを持つネットワークに言及しています。