如何在Windows上运行来自pygraphviz的neato

Aml*_*nza 9 neato python-2.7 pygraphviz

我试图在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')
Run Code Online (Sandbox Code Playgroud)

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

"ValueError:在路径中找不到程序neato."

该错误引用了agraph.py文件pygraphviz,但是当我查看agraph.py时,我看不到任何可能导致问题的内容

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

Ant*_*ony 10

我有同样的问题.这就是我所做的,以防其他人在努力让pygraphvis在Windows上运行.

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

呼叫neato -V工作,所以它在我的PATH上.我发现问题是python是在安装pygraphvis之前创建的命令提示符下运行的,所以PATH没有更新.重新启动命令提示符修复了此问题,但导致了一个新错误,即一个关于C:\Program不是有效命令的错误.

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

mklink /d C:\ProgramFilesx86 "C:\Program Files (x86)"
Run Code Online (Sandbox Code Playgroud)

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

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


Enr*_*eri 4

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

最简单的解决方案是尝试不同的绘图解决方案而不是 neato。接受的选项是:

neato
dot
twopi
circo
fdp
nop
Run Code Online (Sandbox Code Playgroud)

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

参见http://www.graphviz.org/

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

import networkx as nx
G = G=nx.from_numpy_matrix(A)
nx.draw(G)
Run Code Online (Sandbox Code Playgroud)