web-dev-qa-db-ja.com

GraphVizには大きすぎる無向グラフの視覚化

178,000のノードと500,000のエッジを持つ無向グラフをレンダリングするためのアドバイスが必要です。 Neato、Tulip、Cytoscapeを試しました。ネイトは遠く離れてさえ来ません、そして、チューリップとCytoscapeは彼らがそれを扱うことができると主張しますが、そうすることができないようです。 (チューリップは何もせず、Cytoscapeは動作していると主張し、その後停止します。)

リモートで妥当なノードのレイアウトを持つベクトル形式のファイル(psまたはpdf)が欲しいです。

70
Gabe

Graphviz自体は、大きなグラフをレンダリングするためのソリューションを提供します。

つまり、Graphvizには、プロジェクト内で大きなグラフ(70kノード、500,000エッジ)を描画するのに役立つ大きな無向グラフのレイアウト用のfdp(graphviz、neatoに類似)のマルチスケールバージョンsfdpが含まれています。 。

このソフトウェアのドキュメントは、graphviz Webサイト自体で http://www.graphviz.org/ にあります。

詳細については、基礎となる技術と例について説明したペーパーがここにあります: http://yifanhu.net/PUB/graph_draw_small.pdf

26
Anthony Liekens

最初にデータの前処理を行うことをお勧めします。たとえば、ノードをクラスターに折りたたみ、次にクラスターを視覚化することです。折りたたむと、ノードの数が減り、Kamada-KawaiやFruchterman-Reingoldなどのアルゴリズムが結果のグラフをレンダリングしやすくなります。

500.000ノードを視覚化する必要がある場合は、単純な円形レイアウトの使用を検討できます。これは、力ベースのアルゴリズムが抱える問題なしで簡単にレンダリングできます。 Circosを見てください: http://mkweb.bcgsc.ca/circos/

Circosは、バイオインフォマティクスの人々が開発したグラフの視覚化であり、ゲノムやその他の非常に大きく複雑なデータセットを視覚化するように調整されています。

Perlベースのパッケージであり、問​​題がないことを願っています。

20
DrDee

Pythonで graph-tool ライブラリを使用すると、良い結果が得られました。以下のグラフには、1,490のノードと19,090のエッジがあります-私のラップトップでレンダリングするのに約5分かかりました。

political blogging network

グラフデータは、AdamicとGlanceが 「政治ブログ界と2004年米国選挙」 pdfリンク ここ で説明している政治ブログネットワークから取得しています。ズームインすると、各ノードのブログURLが表示されます。

zoomed

ここに私がそれを描くために使用したコードがあります(ブログ http://ryancompton.net/2014/10/22/stochastic-block-model-based-Edge-bundles-in-graph-tool/ ) :

import graph_tool.all as gt
import math

g = gt.collection.data["polblogs"] #  http://www2.scedu.unibo.it/roversi/SocioNet/AdamicGlanceBlogWWW.pdf
print(g.num_vertices(), g.num_edges())

#reduce to only connected nodes
g = gt.GraphView(g,vfilt=lambda v: (v.out_degree() > 0) and (v.in_degree() > 0) )
g.purge_vertices()

print(g.num_vertices(), g.num_edges())

#use 1->Republican, 2->Democrat
red_blue_map = {1:(1,0,0,1),0:(0,0,1,1)}
plot_color = g.new_vertex_property('vector<double>')
g.vertex_properties['plot_color'] = plot_color
for v in g.vertices():
    plot_color[v] = red_blue_map[g.vertex_properties['value'][v]]

#Edge colors
alpha=0.15
Edge_color = g.new_Edge_property('vector<double>')
g.Edge_properties['Edge_color']=Edge_color
for e in g.edges():
    if plot_color[e.source()] != plot_color[e.target()]:
        if plot_color[e.source()] == (0,0,1,1):
            #orange on dem -> rep
            Edge_color[e] = (255.0/255.0, 102/255.0, 0/255.0, alpha)
        else:
            Edge_color[e] = (102.0/255.0, 51/255.0, 153/255.0, alpha)            
    #red on rep-rep edges
    Elif plot_color[e.source()] == (1,0,0,1):
        Edge_color[e] = (1,0,0, alpha)
    #blue on dem-dem edges
    else:
        Edge_color[e] = (0,0,1, alpha)

state = gt.minimize_nested_blockmodel_dl(g, deg_corr=True)
bstack = state.get_bstack()
t = gt.get_hierarchy_tree(bstack)[0]
tpos = pos = gt.radial_tree_layout(t, t.vertex(t.num_vertices() - 1), weighted=True)
cts = gt.get_hierarchy_control_points(g, t, tpos)
pos = g.own_property(tpos)
b = bstack[0].vp["b"]

#labels
text_rot = g.new_vertex_property('double')
g.vertex_properties['text_rot'] = text_rot
for v in g.vertices():
    if pos[v][0] >0:
        text_rot[v] = math.atan(pos[v][1]/pos[v][0])
    else:
        text_rot[v] = math.pi + math.atan(pos[v][1]/pos[v][0])

gt.graph_draw(g, pos=pos, vertex_fill_color=g.vertex_properties['plot_color'], 
            vertex_color=g.vertex_properties['plot_color'],
            Edge_control_points=cts,
            vertex_size=10,
            vertex_text=g.vertex_properties['label'],
            vertex_text_rotation=g.vertex_properties['text_rot'],
            vertex_text_position=1,
            vertex_font_size=9,
            Edge_color=g.Edge_properties['Edge_color'],
            vertex_anchor=0,
            bg_color=[0,0,0,1],
            output_size=[4024,4024],
            output='polblogs_blockmodel.png')
18
dranxo

Gephi を試してください。何百万ものノードに対応する OpenOrd という新しいレイアウトプラグインがあります。

12
Ollie Glass

Mathematicaで処理できる可能性は非常に高いですが、最初の反応は、「紙片を取り、黒く塗りつぶす」というコメントに沿っていたことを認めなければなりません。グラフの密度を下げる方法はありませんか?

考えられる問題は、レンダリングだけでなくレイアウトを探しているように見えることです。さまざまなツールで実装されたレイアウトのBig O特性についての知識はありませんが、直感的には、大量のデータをレイアウトするにはlong時間がかかると思います。

4
Larry OBrien

本当に正確である必要がありますか?

達成しようとしていることに応じて、データ量の10%または1%をグラフ化するだけで十分かもしれません。 (もちろん、それは完全に役に立たないかもしれませんが、それはすべて視覚化の目的に依存します)

3
jplindstrom

BioFabric( www.BioFabric.org )は、大きなグラフを視覚化するためのもう1つのツールです。説明したネットワーク(178,000ノードと500,000エッジ)を処理できる必要がありますが、初期レイアウトには時間がかかる場合があります。ここのネットワークショー(スタンフォード大規模ネットワークデータセットコレクションから)は、281,903ノードと2,312,497エッジを持つスタンフォードWebネットワークです。

Stanford Web Network BioFabricのスケーラビリティは、ノードをポイントとしてではなく、水平線として表すという事実によるものです。エッジは垂直線として表示されます。これがどのように機能するかについてのいくつかの直感のために、 Super-Quick BioFabric Demo があります。これは、D3を使用してアニメーション化される小さなネットワークです。

主要なアプリケーションはJavaで記述されています。現時点では、PNG画像のみをエクスポートでき、PDFはエクスポートできません。 PDF RBioFabric からのエクスポートオプションがありますが、これは非常に大規模なネットワークをまだ処理できない非常に単純な実装です。

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

2
wjrl

Edgeクラスタリング( http://www.visualcomplexity.com/vc/project_details.cfm?id=679&index=679&domain= )が役立つと期待しています。この手法は、関連するエッジをまとめて、グラフの視覚的な複雑さを軽減します。ただし、アルゴリズムを自分で実装する必要がある場合があります。

2
Ollie Glass

AiSeeを試すことができます: http://www.aisee.com/manual/unix/56.htm

1
Johan

他のすべてが失敗した場合、デバッグシナリオとして、これらのツールの開発者にサニタイズバージョンのファイルを提供できます。

1
Chris Wenham

Java/JythonベースのGUESSを確認してください。 http://graphexploration.cond.org/

1
thestoneage

Large Graph Layout(LGL) プロジェクトは、同様の問題を抱えて私を大いに助けてくれました。それはレイアウトを処理し、小さなJava 2Dで生成されたレイアウトを描画するアプリを持っています。ベクトル出力はボックスから出ないので、グラフを自分で描画する必要があります(LGLによって生成されたノード座標を考えると)

1
Nikita Nemkin

最初に、sfdpを試すためのアリエケンの提案を2番目に紹介します。 Neatoの大規模バージョンです。

OJWが示唆するように、R2にノードをプロットすることもできます。あなたのエッジは、実際に彼が「自然な順序付け」と呼ぶものを供給します。特に、正規化グラフラプラシアンの2番目と3番目の固有ベクトルの成分をプロットできます。これは、 スペクトルクラスタリングに関するこのウィキペディアのページ のマトリックスLです。この行列を、その背後の線形代数を理解することなく書き留めることができるはずです。次に、大規模なスパース行列の最初の数個の固有ベクトルを近似的に計算することに問題を減らしました。これは伝統的に反復法によって行われ、標準線形代数パッケージに実装されています。この方法は、非常に大きなグラフに拡大する必要があります。

0
MRocklin

NAViGaTOR (開示:私はそのソフトウェアの開発者の一人です)を試すこともできます。私たちは、最大170万のエッジを持つグラフの視覚化に成功しました。このような大規模なネットワークは操作が困難ですが(ユーザーインターフェイスが遅くなります)。ただし、視覚化にはOpenGLを使用するため、オーバーヘッドの一部はグラフィックカードに転送されます。

また、大きなネットワークを正常に開く前に、[ファイル]-> [設定]ダイアログボックスでメモリ設定を上げる必要があることに注意してください。

最後に、他の回答のほとんどが指摘しているように、データをより小さく、より意味のあるものに再編成する方がよいでしょう。

0
Alinium

フラットなレイアウトでそれを視覚化することに、あなたが遠く近づかないと思います。

Hyperbolic Graphs、この研究論文で説明 しばらく興味をそそられました。 SourceForge からソフトウェアを試してください。

別のアイデアは、 Panopticode で見られるように TreeMap を使用してノードをグラフ化することです。

0
Andy Dent

グラフを視覚化できるWindowsツールは pajek で、eps出力を生成しますが、データを読み取れるかどうかはわかりません。

0
Jasper

ここにアプリのリストがあります: http://www.mkbergman.com/?p=414

セイウチとLGLは、大きなグラフに適していると思われる2つのツールです。ただし、両方ともグラフを独自の特別な形式のテキストファイルとして入力する必要があるようで、これは苦痛かもしれません。

0
Rex