Python 3的networkx draw_graphviz()无法工作

5

我想用Python 3中的networkx和graphviz绘制一个简单的图表:

import networkx as nx

G = nx.complete_graph(3)
nx.draw_graphviz(G)

我正在使用Ubuntu14.04和IPython3,像往常一样,我使用pip3安装了networkx,运行代码时给了我以下提示:

ImportError: pydot could not be loaded: http://code.google.com/p/pydot/

我尝试安装pydotplus并运行代码:

/usr/local/lib/python3.4/dist-packages/networkx/drawing/nx_pydot.py in pydot_layout(G, prog, root, **kwds)
    294 
    295         if isinstance(node,list):
--> 296             node=node[0]
    297         pos=node.get_pos()[1:-1] # strip leading and trailing double quotes
    298         if pos != None:

IndexError: list index out of range

另外还有pydot2:

/usr/local/lib/python3.4/dist-packages/pydot.py in write(self, path, prog, format)
   1893             prog = self.prog
   1894 
-> 1895         dot_fd = file(path, "w+b")
   1896         if format == 'raw':
   1897             data = self.to_string()

NameError: name 'file' is not defined

我花了很多时间搜索和安装其他的pydots和pygraphviz组合,但还是没有成功。

虽然这可能与以下问题有关: pydot和graphviz错误:无法导入dot_parser,将无法加载dot文件,但这并不能解决Python 3中的问题。


这个链接 https://groups.google.com/forum/#!topic/pygraphviz-discuss/mbK5voZ9-hs 解释了一些问题吗? - Joel
我认为pygraphviz依赖于解析DOT语言,这是pydot的工作?而现在某种程度上是pydot与Python3不兼容,而不是pygraphviz。 - pterodragon
值得一提的是,我通过使用 networkx.write_dot(G, 'graph.dot') 输出一个 .dot 文件来实现所需的结果,然后执行适当的 graphviz 输出命令,如 neato -T png graph.dot > graph.png。(需要预先安装 graphviz;请参阅 man 页面了解更多信息) - pterodragon
你可以将其作为答案添加。其他遇到相同问题的人可能不会查看评论。 - Joel
一些额外的信息:目前,pygraphviz声称可以与Python 3兼容,但是在此时此刻,我使用源代码进行安装,通过运行python3 setup.py install,而在Python3中导入pygraphviz会出现ImportError: No module named '_graphviz' - pterodragon
此外,这里的Ubuntu软件包也无法正常工作:http://packages.ubuntu.com/wily/python3-pygraphviz-dbg - pterodragon
3个回答

2
您可以通过编辑第#292行来修复此问题:
    pydot_node = pydot.Node(make_str(n)).get_name().encode('utf-8')

去掉结尾的编码:

    pydot_node = pydot.Node(make_str(n)).get_name() #.encode('utf-8')

我已经在这里报告了这个bug /修复。


它确实解决了在这种情况下使用pydotplus时的错误:)。但我仍然看不到matplotlib窗口弹出? - pterodragon
@pterodragon Matplotlib 是否处于交互模式?你可能需要执行 plt.show() 命令以显示图形窗口。 - mfitzp
我以为它会自动显示。谢谢你的帮助!:) - pterodragon

2
这似乎是一个相同的问题,即你正在使用的 pydot 版本与 Python 3 不兼容,Python 3 中已经移除了 file(...)。我注意到这个问题并在 PyPi 上设置了 Python 3 兼容版本。 对于 Python 3.x 的 Linux 系统,请尝试: pip3 install pydot3 或者对于一般的 Python 2.x,请尝试: pip install pydot3

1

虽然不是非常好的答案,但它可以作为一种解决方法。

首先使用Python输出.dot文件,方法是networkx.write_dot(G, 'graph.dot')

然后在命令行上执行适当的graphviz输出命令,例如neato -T png graph.dot > graph.png


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