什么原因导致 NetworkX 和 PyGraphViz 单独运行正常,但一起运行时出现问题?

30

我正在学习一些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代码片段也会产生类似的错误,

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的教程页面,位于布局和绘图。这里也有一些代码片段。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单独工作得很好,但在一起时却无法正常工作?

2个回答

56

networkx-1.11中的draw_graphviz函数存在一个小错误,由于graphviz绘图工具不再导入到networkx的顶层命名空间中而触发。

以下是解决方法

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

这些命令使用graphviz来计算节点的位置(graphviz_layout 默认使用 neato),并使用matplotlib来实际绘制图形。

3

nx.nx_pydot.graphviz_layout() 似乎是在 Networkx release 1.11 中使用 graphviz_layout 的方法。

您可能需要通过Graphviz进行安装。

sudo apt-get install graphviz

文档中的一些示例代码:

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

我建议这个Graphviz_layout 1.11的文档

可以作为参考。


你如何运行Graphviz二进制文件? - Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接