web-dev-qa-db-ja.com

NetworkXとPyGraphVizが単独では正常に動作し、一緒に動作しない原因は何ですか?

私はいくつかのPythonグラフの視覚化を学んでいます。 somethings やってみたいブログ記事がいくつか見つかりました。残念なことに私は遠くに行かず、次のエラーが発生しました:AttributeError: 'module' object has no attribute 'graphviz_layout'

私のシステムでエラーを再現するコードの最も簡単な断片はこれです、

In [1]: import networkx as nx
In [2]: G=nx.complete_graph(5)
In [3]: nx.draw_graphviz(G)
------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-481ad1c1771c> in <module>()
----> 1 nx.draw_graphviz(G)
/usr/lib/python2.7/site-packages/networkx/drawing/nx_pylab.pyc in draw_graphviz(G, prog, **kwargs)
982 See networkx.draw_networkx() for a description of optional keywords.
983 """
--> 984 pos = nx.drawing.graphviz_layout(G, prog)
985 draw(G, pos, **kwargs)
986
AttributeError: 'module' object has no attribute 'graphviz_layout'

同様の questions 、および posts がこのコンボで問題を抱えていましたが、まったく同じエラーではありませんでした。 1つは close でしたが、自動的に解決されました。

最初に、 NetworkX とPyGraphViz( Scipy と同様の要件をリストする)に必要なすべてのパッケージがインストールされていることを確認しました。

次に、Pythonでこれらのモジュールのインストールをテストするためにスニペットを探しました。最初の2つの例は、 NetworkXリファレンスドキュメント からのものです。これは、MatPlotLibとGraphVizの両方を使用したスニペットの例をいくつかリストしています。

MatPlotLibのコード例は私のために機能します(画面に画像をレンダリングします)

In [11]: import networkx as nx
In [12]: G=nx.complete_graph(5)
In [13]: import matplotlib.pyplot as plt
In [13]: nx.draw(G)
In [13]: plt.show()  

ただし、GraphViz切り取り部分も同様のエラーを生成します

In [16]: import networkx as nx
In [17]: G=nx.complete_graph(5)
In [18]: H=nx.from_agraph(A)
------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-18-808fa68cefaa> in <module>()
----> 1 H=nx.from_agraph(A)
AttributeError: 'module' object has no attribute 'from_agraph'
In [19]: A=nx.to_agraph(G)
------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-19-32d1616bb41a> in <module>()
----> 1 A=nx.to_agraph(G)
AttributeError: 'module' object has no attribute 'to_agraph'
In [20]: print G
complete_graph(5)

次に、PyGraphVizのチュートリアルページLayout&Drawing で試しました。これにはいくつかの切り抜きもあります。 PeGraphVizが渡されたNeato(デフォルト)、PyDot、およびCirco Post Script出力(Gimpを使用して表示)。 (唯一の違いは、これらのPyGraphVizの例がディスプレイではなくファイルにレンダリングされることです)。

In [1]: import pygraphviz as pgv
In [2]: d={'1': {'2': None}, '2': {'1': None, '3': None}, '3': {'2': None}}
In [3]: A=pgv.AGraph(d)
In [4]: A.write("pygraphviz_test_01.dot")
In [5]: A.layout()
In [6]: A.draw('pygraphviz_test_01.png')

複雑さを増す、PyGraphViz GraphVizが必要 動作させるにはパッケージバイナリが必要です。私はArch Linuxを使用しており、そのディストリビューションのバージョンをインストールしています。 Arch Linuxには インストールをテストする例 (再度、ファイルへの出力)があり、これも合格しました

私は何が欠けていますか? NetworkXとPyGraphVizが単独では正常に動作し、一緒に動作しない原因は何ですか?

27
xtian

Graphviz描画ツールがnetworkxのトップレベル名前空間にインポートされなくなったという変更によって引き起こされるnetworkx-1.11のdraw_graphviz関数には小さなバグがあります。

次は回避策です

In [1]: import networkx as nx

In [2]: G = nx.complete_graph(5)

In [3]: from networkx.drawing.nx_agraph import graphviz_layout

In [4]: pos = graphviz_layout(G)

In [5]: nx.draw(G, pos)

to_agraphwrite_dotなどの他の関数を使用するには、長いパス名を明示的に使用する必要があります

 nx.drawing.nx_agraph.write_dot()

または、関数を最上位の名前空間にインポートします

from networkx.drawing.nx_agraph import write_dot()
write_dot()
51
Aric

nx.nx_pydot.graphviz_layout()graphviz_layout inNetworkxリリース1.11

Graphviz をインストールする必要があるかもしれません

Sudo apt-get install graphviz

ドキュメントのサンプルコード:

import networkx as nx
G = nx.complete_graph(4)
pos = nx.nx_pydot.graphviz_layout(G)

これを 1.11のGraphviz_layoutドキュメント としてお勧めします

2
Utku