我正在努力学习一些 Python 图形可视化。我发现一些博客文章做了一些 我想尝试的事情。不幸的是,我没有走得太远,遇到了这个错误: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'
我发现了一个类似的问题,以及这个组合有困难的帖子,但不完全相同的错误。一个很接近,但它自动解决了自己。
首先,我验证了NetworkX和PyGraphViz 所需的所有软件包(列出了与Scipy类似的要求)都已安装。
接下来,我寻找片段来测试我在 Python 中安装这些模块。前两个示例来自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 snips 也会产生类似的错误,
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教程页面。这也有一些剪辑。PyGraphViz 通过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 单独工作但不能一起工作?