我正在努力学习一些Python图形可视化。我发现了一些我想尝试的博客文章some things。不幸的是,我并没有走太远,遇到了这个错误: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'

我发现类似的questionsposts在使用此组合时遇到困难,但并没有完全相同的错误。其中一个是close,但是它会自动解决。

首先,我验证了NetworkX和PyGraphViz(列出了与Scipy类似的要求)的所有必需软件包

接下来,我寻找了一些片段来测试我在Python中安装这些模块的情况。 前两个示例来自NetworkX Reference Documentation。这列出了同时使用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)

然后,我在Layout & Drawing上尝试了PyGraphViz的教程页面。这也有一些剪。 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 requires GraphViz软件包的二进制文件可以使工作更加复杂。我正在使用Arch Linux,并安装了该发行版的版本。 Arch Linux有一个example to test installation(再次输出到文件),它也传递了

我想念什么? 是什么会导致NetworkX和PyGraphViz单独工作但不能一起工作?

最佳答案

由于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()

或将函数导入顶级 namespace
from networkx.drawing.nx_agraph import write_dot()
write_dot()

10-06 07:03