无需pygraphviz即可将networkx图形移植到graphviz

port networkx graph to graphviz without pygraphviz

我正在Windows机器上使用Python 3进行工作,尽管付出了很多努力,但仍无法安装pygraphviz。 单独讨论。

我有networkx和graphviz模块...是否存在用于在networkx中构建网络图并将其提取为graphviz格式以供不使用pygraphviz显示的范例?

似乎drawing.nx_agraph和nx_agraph中的所有相关功能都需要pygraphviz,但我已经习惯于使用networkx并喜欢其中的功能。 在networkx的文档中,它甚至说他们专注于图形对象的开发,而不是实际的显示。


我知道这是一个古老的问题,但我一直在寻找同一件事:如何从NetworkX中的图形获取点符号?

(如果您仅对答案感兴趣,请跳过此段。我实际上想显示一个NetworkX多重图形,但是即使NetworkX是用于处理网络和图形的强大python库,但在显示(渲染)时它的选择也相当有限。图和网络。NetworkX使用Matplotlib提供可视化图的基本功能,而没有可视化多图的选项NetworkX不用于可视化图,因此在NetworkX文档中,他们建议使用某些图可视化工具,例如Cytoscape,Gephi, Graphviz。所有这些工具都有某种python接口,但最好的(最简单易用)是Graphviz,它支持Graphviz绘图软件的DOT语言,在graphviz中可视化图形非常简单方便,您可以使用一个短线,例如graph.view(),默认情况下会创建一个PDF文件并在系统的默认PDF查看器中打开它,但是您也可以查看和创建imag e文件,例如SVG和PNG。因此,将NetworkX图转换为graphviz图并执行此操作是理想的,您需要将NetworkX图转换为DOT表示法,然后可以由graphviz读取)。

Aric的解决方案很简单,可用于打印图形的DOT表示法,但是有点麻烦,在我的情况下,我需要将DOT表示法保存在字符串变量中,以便可以使用它从该DOT在graphviz中创建图形符号。

networkx.drawing.nx_pydot.write_dot(源)是创建DOT格式并将其保存到路径(文件句柄)的函数。该函数的代码是:

1
2
3
4
5
@open_file(1, mode='w')
def write_dot(G, path):
    P = to_pydot(G)
    path.write(P.to_string())
    return

这为我们提供了答案的解决方案:

1
2
3
4
5
6
from networkx import path_graph
from networkx.drawing.nx_pydot import to_pydot

G = path_graph(4)
dot = to_pydot(G).to_string()
print(dot)

函数to_pydot(源)使用pydot库创建具有to_string(源)方法的pydot.Dot对象,该方法以DOT语言返回图形的字符串表示形式。

附言:
要在graphviz中渲染DOT源代码,您可以执行以下操作:

1
2
3
from graphviz import Source
src = Source(dot) # dot is string containing DOT notation of graph
src.view()

P.P.S .:
当使用Matplotlib(图像的左侧)和graphviz(图像的右侧)来可视化图形networkx.margulis_gabber_galil_graph(3)时,以下两张图片显示了差异:

enter image description here


您可以将pydot(https://pypi.python.org/pypi/pydot)用作PyGraphviz的纯Python替代品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In [1]: import networkx

In [2]: import sys

In [3]: G = networkx.path_graph(4)

In [4]: networkx.drawing.nx_pydot.write_dot(G,sys.stdout)
strict graph  {
0;
1;
2;
3;
0 -- 1;
1 -- 2;
2 -- 3;
}