12

我正在尝试在 python (v 2.7) 中使用 pygraphviz 和 networkx 来创建网络图。我发现了一个在 stackoverflow 上看起来非常有用的脚本:

import networkx as nx
import numpy as np
import string
import pygraphviz

dt = [('len', float)]
A = np.array([(0, 0.3, 0.4, 0.7),
               (0.3, 0, 0.9, 0.2),
               (0.4, 0.9, 0, 0.1),
               (0.7, 0.2, 0.1, 0)
               ])*10
A = A.view(dt)

G = nx.from_numpy_matrix(A)
G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())),string.ascii_uppercase)))    

G = nx.to_agraph(G)

G.node_attr.update(color="red", style="filled")
G.edge_attr.update(color="blue", width="2.0")

G.draw('/tmp/out.png', format='png', prog='neato')

我在最后一行得到一个错误,基本上它找不到neato:

“ValueError:在路径中找不到程序整洁。”

该错误指的是 agraph.py 文件pygraphviz,但是当我查看 agraph.py 时,我看不到任何可能导致问题的东西

任何想法如何解决这个问题?我正在使用 windows 和 IDLE 进行编码。谢谢!

4

5 回答 5

13

我有同样的问题。这是我所做的,以防其他人努力让 pygraphvis 在 Windows 上工作。

首先,我安装了graphviz。我试图通过 pip 安装 pygraphvis,但它拒绝工作。最终,我找到了非官方的 Windows 二进制文件,所以我安装了它。导入模块现在可以工作,但调用G.layout()导致上述错误。

调用neato -V有效,所以它在我的路径上。我发现问题在于 python 在安装 pygraphvis 之前创建的命令提示符中运行,因此 PATH 没有更新。重新启动命令提示符解决了这个问题,但导致了一个新错误,关于C:\Program不是一个有效的命令。

我认为 pygraphvis 可能无法正确引用路径,这意味着它会在 Program Files 中的空间处截断。我通过将其符号链接到没有空格的路径来解决问题。

mklink /d C:\ProgramFilesx86 "C:\Program Files (x86)"

请注意,这必须在管理员模式下运行。您可以通过转到开始菜单,输入 cmd,然后按 Ctrl+shift+enter 来完成。

在此之后,我编辑了我的 PATH 以引用符号链接,重新启动 cmd,一切正常。

于 2013-06-02T19:09:54.820 回答
4

问题是 pygraphviz 调用了一个外部程序,即 graphviz 套件的一部分,称为neato来绘制图形。发生的事情是您没有安装 graphviz 并且当 python 尝试调用它时它抱怨找不到它。实际上 pygraphviz 只是一个包装器,它使您可以从 python 内部调用 graphviz,但它本身不做任何事情,并且默认情况下不安装 graphviz。

最简单的解决方案是为情节尝试不同的解决方案,而不是使用neato。接受的选项是:

neato
dot
twopi
circo
fdp
nop

尝试其中一个,看看其中一个是否有效。否则,您可以安装 graphviz,它将为您提供所需的程序。它是每个平台上都可用的开源程序,因此安装它应该不是问题。

http://www.graphviz.org/

如果您只需要绘制图形草图,则可以在 networkx 图形上使用 networkx.draw 函数,该函数使用 matplotlib 创建交互式绘图。

import networkx as nx
G = G=nx.from_numpy_matrix(A)
nx.draw(G)
于 2013-02-04T20:31:14.187 回答
2

您的问题是neato缺少。
neato是 graphviz 套件的一部分,您可以从这里安装到您的 PC 上。(我用过.msi

现在,neato 已“安装”,但您的系统不知道在哪里。因此,将neato.exe包含的目录添加到您的PATH环境变量中。在 Win10 上,这可以使用Start -> Edit environment variables for your account -> select path in the upper window -> edit -> New -> C:\Program Files (x86)\Graphviz2.38\bin\ 或任何您的安装目录来完成。

于 2018-10-15T07:38:32.810 回答
1

尝试这样的事情,看看 pygraphviz 认为你的外部程序在哪里:

# Get paths of graphviz programs
import pygraphviz as pgv

A = pgv.AGraph()
progs_list = ['neato', 'dot', 'twopi', 'circo', 'fdp', 'nop', 'wc', 'acyclic', 'gvpr',
              'gvcolor', 'ccomps', 'sccmap', 'tred', 'sfdp', 'unflatten']
for prog in progs_list:
    try:
        runprog = A._get_prog(prog)
        print(f'{runprog}')
    except ValueError as e:
        print(f'{prog} gets this error: {str(e).strip()}')

在查看结果之后,在您的 IDE 之外安装 Graphviz 并在系统控制面板中设置您的 Path 环境变量等需要做很多工作。

于 2021-02-09T01:39:04.230 回答
1

导致此错误的原因可能不止一个,但如果它是由缺少 graphviz modules 的路径引起的[neato,dot,twopi,circo,fdp,nop],那么有一个 hack 对我有用。我目前正在询问正确的解决方案是什么,但是您可以使用它

if  not 'C:\\Program Files (x86)\\Graphviz2.38\\bin' in os.environ["PATH"]: 
    os.environ["PATH"] += os.pathsep + 'C:\\Program Files (x86)\\Graphviz2.38\\bin' 

在脚本的开头。概括地说,如果您的 graphviz 文件保存在其他地方:

graph_path='your_bin_folder_path'
    if  not graph_path in os.environ["PATH"]: 
        os.environ["PATH"] += os.pathsep + graph_path

特别是,这适用于 Windows 10,使用 anaconda navigator 和 python 版本 3.7。

于 2019-11-04T20:57:29.890 回答