我正在尝试在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:在路径中找不到程序neato。”
错误引用了pygraphviz
的agraph.py文件,但是当我查看agraph.py时,我看不到任何可能导致问题的文件
任何想法如何解决这个问题?我正在使用Windows和IDLE进行编码。 谢谢!
答案 0 :(得分:9)
我遇到了同样的问题。这就是我所做的,以防其他任何人努力让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)"
请注意,这必须在管理员模式下运行。您可以转到开始菜单,输入cmd,然后按Ctrl + shift + enter来完成。
在此之后,我编辑了我的PATH以引用符号链接,重新启动cmd,一切正常。
答案 1 :(得分:1)
问题是pygraphviz调用一个外部程序,它是graphviz套件的一部分,名为neato,用于绘制图形。发生了什么事情,你没有安装graphviz,当python试图调用它时,它抱怨没有找到它。实际上pygraphviz只是一个包装器,它让你可以从python内部调用graphviz,但本身并没有做任何事情,并且默认情况下不安装graphviz。
最简单的解决方案是为情节而不是neato尝试不同的解决方案。接受的选项是:
neato
dot
twopi
circo
fdp
nop
尝试其中一个,看看其中一个是否有效。否则你可以安装graphviz,它将为你提供所需的程序。它和开源程序在每个平台上都可用,因此安装它应该不是问题。
如果您只需要绘制图形草图,则可以在networkx图上使用networkx.draw函数,该函数使用matplotlib创建交互式图。
import networkx as nx
G = G=nx.from_numpy_matrix(A)
nx.draw(G)
答案 2 :(得分: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 环境变量等工作量很大。
答案 3 :(得分:0)
您的问题是缺少__psynch_mutexwait
。
neato
是graphviz套件的一部分,您可以将其安装在PC上,例如来自here。 (我使用了neato
)
现在neato已“安装”,但是您的系统不知道在哪里。因此,将包含.msi
的目录添加到neato.exe
环境变量中。在Win10上,可以使用PATH
完成此操作
或任何您的安装目录。
答案 4 :(得分:0)
造成此错误的原因可能不止一种,但如果是由于graphviz模块[neato,dot,twopi,circo,fdp,nop]
缺少路径所致,那么有一种对我有用的技巧。我目前正在问什么是正确的解决方案,但是您可以使用此
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导航器和python版本3.7起作用。