2012-04-30 4 views
14

私は有向グラフで行われるプロセスをシミュレートするためにPythonを使用しています。このプロセスのアニメーションを制作したいと思います。有向グラフをPythonですべての辺を別々に表示するようにプロットする

私が遭遇した問題は、ほとんどのPythonグラフビジュアライゼーションライブラリが有向エッジのペアを1つのエッジに結合していることです。

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.MultiDiGraph() 

G.add_edges_from([ 
    (1, 2), 
    (2, 3), 
    (3, 2), 
    (2, 1), 
]) 

plt.figure(figsize=(8,8)) 
nx.draw(G) 

Output from NetworkX; parallel edges are overlapping, so only two lines are displayed

私はこのようなものを表示したい各々と、私は別々に四辺の各々を表示したい一方で、次のグラフを表示する場合、例えば、NetworkXは、2つのエッジを描きます個別に描かれたパラレルエッジ:

Desired output format; parallel edges are drawn separately

質問R reciprocal edges in igraph in Rは同じ問題に対処するようだが、そこに解決策Pythonのものではなく、R igraphライブラリのためのものです。

既存のPythonグラフビジュアライゼーションライブラリを使用してこのスタイルのプロットを作成する簡単な方法はありますか?マルチグラフをサポートできるのであればボーナスになるでしょう。

私は、画像を生成するための外部プログラムを呼び出すソリューションを公開しています。アニメーションフレーム全体を生成したいので、ソリューションを自動化する必要があります。

+0

関連http://stackoverflow.com/questions/15053686/networkx-overlappin g-edges-visualization-multigraph –

答えて

15

Graphvizツールは、明確なエッジを表示するように見えます。 dot

digraph G { 
    A -> B; 
    A -> B; 
    A -> B; 
    B -> C; 

    B -> A; 
    C -> B; 
} 

を生成します:「のpythonを探しても

example graph

Graphvizのの入力言語は、あなたが自分でそれを生成することができ非常に単純です。この与え例えば

、 graphvizは2つのライブラリを生成します。 NetworkX、ファイルI/Oを回避し、レイアウトのPYDOTを経由してドットを使用して回避策を使用して

+2

NetworkXは[pydotを使って.dotファイルをエクスポートする]ことができます(http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pydot)。 [pygraphviz](http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_agraph)。これは完全に機能します。ありがとう! –

9

は次のとおりです。seek(0)が必要な理由のため

import networkx as nx 
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
from cStringIO import StringIO 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) # d is a pydot graph object, dot options can be easily set 
# attributes get converted from networkx, 
# use set methods to control dot attributes after creation 

png_str = d.create_png() 
sio = StringIO() # file-like string, appropriate for imread below 
sio.write(png_str) 
sio.seek(0) 

img = mpimg.imread(sio) 
imgplot = plt.imshow(img) 

は、

How to create an image from a string in pythonが表示された場合はIPython内(QT)コンソールは、上記のインラインで印刷され、より直接的なアプローチは次のとおりです。

import networkx as nx 
from IPython.display import Image 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) 

png_str = d.create_png() 
Image(data=png_str) 
+0

この例を更新する必要があります: 'nx.to_pydot'は利用できなくなりました。代わりに、 'pip install pydotplus'を実行して、代わりに' nx.drawing.nx_pydot.to_pydot'を使用してください。 – ogrisel

+1

この例を更新する必要が生じたため、更新しました。 'pydotplus'は上流の' networkx'の 'pydot'に既に戻っていますので、[this PR](https://github.com/networkx/networkx/pull/2272)を見てください。 –

+0

pydotplusが 'graphviz'のインストールを見つけられない場合、' InvocationException:GraphVizの実行可能ファイルが見つかりません 'と表示されます。これを回避するには、現在の実行のためにシステムパスに追加することです: 'import os'次に' os.environ ["PATH"] + = r "; C:\ Anaconda \ envs \ testes \ Library \ bin \ graphviz" graphviz実行ファイルが置かれているフォルダを置き換える必要があります。 – mvbentes

関連する問題