绘图#

NetworkX 提供基本的图可视化功能,但其主要目标是实现图分析而非图可视化。未来,图可视化功能可能会从 NetworkX 中移除,或者仅作为附加包提供。

专业的图可视化是困难的,我们强烈建议人们使用专门的工具来可视化他们的图。著名的专用且功能齐全的图可视化工具包括 Cytoscape, Gephi, Graphviz,以及用于 LaTeX 排版的 PGF/TikZ。要使用这些或其他类似工具,您应该将 NetworkX 图导出为这些工具可读的格式。例如,Cytoscape 可以读取 GraphML 格式,因此 networkx.write_graphml(G, path) 可能是一个合适的选择。

这里提供的更多功能信息可在以下链接找到:

Matplotlib#

使用 matplotlib 绘制网络。

示例#

>>> G = nx.complete_graph(5)
>>> nx.draw(G)

另请参见#

draw(G[, pos, ax])

使用 Matplotlib 绘制图 G。

draw_networkx(G[, pos, arrows, with_labels])

使用 Matplotlib 绘制图 G。

draw_networkx_nodes(G, pos[, nodelist, ...])

绘制图 G 的节点。

draw_networkx_edges(G, pos[, edgelist, ...])

绘制图 G 的边。

draw_networkx_labels(G, pos[, labels, ...])

在图 G 上绘制节点标签。

draw_networkx_edge_labels(G, pos[, ...])

绘制边标签。

draw_circular(G, **kwargs)

以环状布局绘制图 G

draw_kamada_kawai(G, **kwargs)

以 Kamada-Kawai 力导向布局绘制图 G

draw_planar(G, **kwargs)

以平面布局绘制平面 NetworkX 图 G

draw_random(G, **kwargs)

以随机布局绘制图 G

draw_spectral(G, **kwargs)

以谱二维布局绘制图 G

draw_spring(G, **kwargs)

以弹簧布局绘制图 G

draw_shell(G[, nlist])

以壳层布局绘制 NetworkX 图 G

Graphviz AGraph (dot)#

pygraphviz AGraph 类的接口。

示例#

>>> G = nx.complete_graph(5)
>>> A = nx.nx_agraph.to_agraph(G)
>>> H = nx.nx_agraph.from_agraph(A)

另请参见#

from_agraph(A[, create_using])

从 PyGraphviz 图返回一个 NetworkX Graph 或 DiGraph。

to_agraph(N)

从 NetworkX 图 N 返回一个 pygraphviz 图。

write_dot(G, path)

将 NetworkX 图 G 以 Graphviz dot 格式写入到路径 path。

read_dot(path)

从路径 path 上的 dot 文件返回一个 NetworkX 图。

graphviz_layout(G[, prog, root, args])

使用 Graphviz 为 G 创建节点位置。

pygraphviz_layout(G[, prog, root, args])

使用 Graphviz 为 G 创建节点位置。

使用 pydot 的 Graphviz#

使用 pydot 以 Graphviz dot 格式导入和导出 NetworkX 图。

可以使用此模块或 nx_agraph 来与 graphviz 交互。

示例#

>>> G = nx.complete_graph(5)
>>> PG = nx.nx_pydot.to_pydot(G)
>>> H = nx.nx_pydot.from_pydot(PG)

另请参见#

from_pydot(P)

从 Pydot 图返回一个 NetworkX 图。

to_pydot(N)

从 NetworkX 图 N 返回一个 pydot 图。

write_dot(G, path)

将 NetworkX 图 G 以 Graphviz dot 格式写入到路径 path。

read_dot(path)

从指定路径的 dot 文件返回一个 NetworkX MultiGraphMultiDiGraph

graphviz_layout(G[, prog, root])

使用 Pydot 和 Graphviz 创建节点位置。

pydot_layout(G[, prog, root])

使用 pydot 和 Graphviz 创建节点位置。

图布局#

用于图绘图的节点定位算法。

对于 random_layout(),可能的最终形状是边长为 [0, scale] 的正方形(默认值:[0, 1])。更改 center 会将布局偏移该量。

对于其他布局例程,范围是 [center - scale, center + scale](默认值:[-1, 1])。

警告:大多数布局例程仅在二维环境中测试过。

arf_layout(G[, pos, scaling, a, etol, dt, ...])

NetworkX 的 Arf 布局

bipartite_layout(G, nodes[, align, scale, ...])

将节点放置在两条直线上。

bfs_layout(G, start, *[, align, scale, center])

根据广度优先搜索算法定位节点。

circular_layout(G[, scale, center, dim])

将节点放置在圆周上。

forceatlas2_layout(G[, pos, max_iter, ...])

使用 ForceAtlas2 力导向布局算法定位节点。

kamada_kawai_layout(G[, dist, pos, weight, ...])

使用 Kamada-Kawai 路径长度代价函数定位节点。

planar_layout(G[, scale, center, dim])

定位节点使边不相交。

random_layout(G[, center, dim, seed])

在单位正方形内随机均匀地定位节点。

rescale_layout(pos[, scale])

将位置数组缩放到所有轴上的 (-scale, scale)。

rescale_layout_dict(pos[, scale])

返回一个以节点为键的缩放位置字典

shell_layout(G[, nlist, rotate, scale, ...])

将节点放置在同心圆中。

spring_layout(G[, k, pos, fixed, ...])

使用 Fruchterman-Reingold 力导向算法定位节点。

spectral_layout(G[, weight, scale, center, dim])

使用图拉普拉斯矩阵的特征向量定位节点。

spiral_layout(G[, scale, center, dim, ...])

以螺旋布局定位节点。

multipartite_layout(G[, subset_key, align, ...])

将节点分层放置在直线上。

LaTeX 代码#

使用 TeX/LaTeX 中的 TikZ 库以 LaTeX 格式导出 NetworkX 图。通常,您希望将绘图显示在 figure 环境中,因此使用 to_latex(G, caption="A caption")。如果您希望获得原始绘图命令而无需 figure 环境,请使用 to_latex_raw()。如果您希望写入文件而非仅返回 LaTeX 代码字符串,请使用 write_latex(G, "filename.tex", caption="A caption")

要构建一个带有子图的 figure(每个子图显示一个图),请为 to_latexwrite_latex 提供图列表、子标题列表以及 figure 内的子图行数。

为了能够在 LaTeX 中使用 \\ref 引用 figure 或 subfigure,提供了关键字 latex_label 用于 figure,sub_labels 用于标签列表,每个 subfigure 一个标签。

我们打算最终提供一个 TikZ 图功能接口,其中包含例如布局算法。

通过 GitHub 告诉我们您希望看到哪些功能可用,或者更好的是提供一些代码来实现它,甚至最好是提交 GitHub pull request 来添加该功能。

TikZ 方法#

绘图选项可以作为节点/边属性存储在图上,或者以字典形式提供,其中键为节点/边,值为该节点/边的选项字符串。类似地,可以通过将标签指定为图节点/边属性,或者提供一个以节点/边为键的字典,其中值为要写入该节点/边的文本来显示每个节点/边的标签。

可以通过关键字参数为 tikzpicture 环境提供选项(例如“[scale=2]”)。类似地,可以通过关键字参数提供默认的节点和边选项。默认的节点选项应用于绘制所有节点(不包括边)的单个 TikZ“路径”。默认的边选项应用于包含每条边路径的 TikZ“作用域”(scope)。

示例#

>>> G = nx.path_graph(3)
>>> nx.write_latex(G, "just_my_figure.tex", as_document=True)
>>> nx.write_latex(G, "my_figure.tex", caption="A path graph", latex_label="fig1")
>>> latex_code = nx.to_latex(G)  # a string rather than a file

您可以更改节点和边的许多特性。

>>> G = nx.path_graph(4, create_using=nx.DiGraph)
>>> pos = {n: (n, n) for n in G}  # nodes set on a line
>>> G.nodes[0]["style"] = "blue"
>>> G.nodes[2]["style"] = "line width=3,draw"
>>> G.nodes[3]["label"] = "Stop"
>>> G.edges[(0, 1)]["label"] = "1st Step"
>>> G.edges[(0, 1)]["label_opts"] = "near start"
>>> G.edges[(1, 2)]["style"] = "line width=3"
>>> G.edges[(1, 2)]["label"] = "2nd Step"
>>> G.edges[(2, 3)]["style"] = "green"
>>> G.edges[(2, 3)]["label"] = "3rd Step"
>>> G.edges[(2, 3)]["label_opts"] = "near end"
>>> nx.write_latex(G, "latex_graph.tex", pos=pos, as_document=True)

然后使用类似 pdflatex latex_graph.tex 的命令编译 LaTeX 文件,并查看生成的 pdf 文件:latex_graph.pdf

如果您希望每个子图包含一个图,可以输入一个图列表。

>>> H1 = nx.path_graph(4)
>>> H2 = nx.complete_graph(4)
>>> H3 = nx.path_graph(8)
>>> H4 = nx.complete_graph(8)
>>> graphs = [H1, H2, H3, H4]
>>> caps = ["Path 4", "Complete graph 4", "Path 8", "Complete graph 8"]
>>> lbls = ["fig2a", "fig2b", "fig2c", "fig2d"]
>>> nx.write_latex(graphs, "subfigs.tex", n_rows=2, sub_captions=caps, sub_labels=lbls)
>>> latex_code = nx.to_latex(graphs, n_rows=2, sub_captions=caps, sub_labels=lbls)
>>> node_color = {0: "red", 1: "orange", 2: "blue", 3: "gray!90"}
>>> edge_width = {e: "line width=1.5" for e in H3.edges}
>>> pos = nx.circular_layout(H3)
>>> latex_code = nx.to_latex(H3, pos, node_options=node_color, edge_options=edge_width)
>>> print(latex_code)
\documentclass{report}
\usepackage{tikz}
\usepackage{subcaption}

\begin{document}
\begin{figure}
  \begin{tikzpicture}
      \draw
        (1.0, 0.0) node[red] (0){0}
        (0.707, 0.707) node[orange] (1){1}
        (-0.0, 1.0) node[blue] (2){2}
        (-0.707, 0.707) node[gray!90] (3){3}
        (-1.0, -0.0) node (4){4}
        (-0.707, -0.707) node (5){5}
        (0.0, -1.0) node (6){6}
        (0.707, -0.707) node (7){7};
      \begin{scope}[-]
        \draw[line width=1.5] (0) to (1);
        \draw[line width=1.5] (1) to (2);
        \draw[line width=1.5] (2) to (3);
        \draw[line width=1.5] (3) to (4);
        \draw[line width=1.5] (4) to (5);
        \draw[line width=1.5] (5) to (6);
        \draw[line width=1.5] (6) to (7);
      \end{scope}
    \end{tikzpicture}
\end{figure}
\end{document}

注意#

如果您想更改 figure/document/subfigure 环境的序言/后言,请使用关键字参数:figure_wrapper, document_wrapper, subfigure_wrapper。默认值存储在私有变量中,例如 nx.nx_layout._DOCUMENT_WRAPPER

参考#

TikZ: https://tikz.dev/

TikZ 选项详情: https://tikz.dev/tikz-actions

to_latex_raw(G[, pos, tikz_options, ...])

返回绘制 G 的 LaTeX/TikZ 代码字符串

to_latex(Gbunch[, pos, tikz_options, ...])

返回绘制 Gbunch 中的图的 LaTeX 代码

write_latex(Gbunch, path, **options)

将绘制图的 LaTeX 代码写入到 path