【问题标题】:What could cause NetworkX & PyGraphViz to work fine alone but not together?什么可能导致 NetworkX 和 PyGraphViz 单独工作但不能一起工作?
【发布时间】:2016-05-18 17:04:06
【问题描述】:

我正在努力学习一些 Python 图形可视化。我发现有几篇博文在做somethings 我想试试。可惜没走多远,遇到这个错误: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 单独工作但不能一起工作?

【问题讨论】:

    标签: python graph graphviz networkx pygraphviz


    【解决方案1】:

    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_layoutusesneato 默认),matplotlib 实际使用plot (i.e. draw) 图形。

    【讨论】:

      【解决方案2】:

      nx.nx_pydot.graphviz_layout() 似乎是在 Networkx 版本 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 documentation for 1.11

      【讨论】:

      • 如何运行 graphviz 二进制文件?
      猜你喜欢
      • 1970-01-01
      • 2021-08-05
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多