【问题标题】:Python 3 networkx draw_graphviz() does not workPython 3 networkx draw_graphviz() 不起作用
【发布时间】:2015-11-17 23:23:44
【问题描述】:

我只想用 Python 3 networkx & graphviz 画一个简单的图:

import networkx as nx

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

我使用的是 ubuntu14.04 和 IPython3,像往常一样我做了 pip3 install 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 and graphviz error: Couldn't import dot_parser, loading of dot files will not be possible,这并不能解决 Python 3 中的问题。

【问题讨论】:

  • 我认为 pygraphviz 依赖于解析 DOT language 这是 pydot 的工作?现在不知何故,与 Python3 不兼容的是 pydot,而不是 pygraphviz。
  • FWIW,我通过使用networkx.write_dot(G, 'graph.dot') 输出.dot 文件,然后执行适当的graphviz 输出命令,如neato -T png graph.dot > graph.png,达到了预期的效果。 (graphviz 必须预先安装;有关更多信息,请参见手册页)
  • 您可以将其添加为答案。有相同问题的其他人可能不会检查 cmets。
  • 一些附加信息:pygraphviz 现在声称现在可以与 Python 3 一起使用,但目前我通过运行python3 setup.py install 使用源代码安装它,而 Python3 中的import pygraphviz 给了我ImportError: No module named '_graphviz' .

标签: python-3.x graphviz networkx


【解决方案1】:

不是一个很好的答案,但它可以作为一种解决方法。

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

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

【讨论】:

    【解决方案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')
    

    我已报告此错误/修复 here

    【讨论】:

    • 它确实解决了在这种情况下使用 pydotplus 时的错误:)。但是还是看不到matplotlib弹窗?
    • @pterodragon matplotlib 是否处于交互模式?您可能需要发送plt.show() 才能显示窗口。
    • 我以为它会自动显示。谢谢你的帮助! :)
    【解决方案3】:

    这似乎与您使用的 pydot 是与使用 file(...) 的 Python 3 不兼容的版本相同的问题。 file(...) 在 Python 3 中已经被移除了。

    我注意到了这个问题,并在 PyPi 上设置了 Python 3 兼容版本。

    对于 Python 3.x 的 Linux 系统,请尝试:

    pip3 install pydot3

    或者一般来说对于 Python 2.x,试试:

    pip install pydot3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多