Drawing#

NetworkX provides basic functionality for visualizing graphs, but its main goal is to enable graph analysis rather than perform graph visualization. In the future, graph visualization functionality may be removed from NetworkX or only available as an add-on package.

Proper graph visualization is hard, and we highly recommend that people visualize their graphs with tools dedicated to that task. Notable examples of dedicated and fully-featured graph visualization tools are Cytoscape, Gephi, Graphviz and, for LaTeX typesetting, PGF/TikZ. To use these and other such tools, you should export your NetworkX graph into a format that can be read by those tools. For example, Cytoscape can read the GraphML format, and so, networkx.write_graphml(G, path) might be an appropriate choice.

More information on the features provided here are available at

Matplotlib#

使用 Matplotlib 绘制网络图。

Examples#

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

See Also#

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)

绘制图 G 使用 Kamada-Kawai 力导向布局。

draw_planar(G, **kwargs)

绘制具有平面布局的平面网络x图 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 类的接口。

Examples#

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

See Also#

from_agraph(A[, create_using])

返回一个从 PyGraphviz 图创建的 NetworkX 图或有向图。

to_agraph(N)

返回一个从 NetworkX 图 N 转换得到的 pygraphviz 图。

write_dot(G, path)

将NetworkX图G写入路径上的Graphviz dot格式文件。

read_dot(path)

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

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

创建图 G 的节点位置,使用 Graphviz。

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

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

Graphviz with pydot#

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

可以使用此模块或 nx_agraph 与 graphviz 进行接口。

Examples#

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

See Also#

from_pydot(P)

从Pydot图创建一个NetworkX图。

to_pydot(N)

从 NetworkX 图 N 返回一个 pydot 图。

write_dot(G, path)

将NetworkX图G写入路径上的Graphviz dot格式。

read_dot(path)

从带有指定路径的dot文件返回一个NetworkX的:class:MultiGraph 或:class:MultiDiGraph

graphviz_layout(G[, prog, root])

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

pydot_layout(G[, prog, root])

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

Graph Layout#

布局#

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

对于 random_layout() ,可能的结果形状 是一个边长为 [0, scale] 的正方形(默认:[0, 1]) 更改 center 会按该数量平移布局。

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

警告:大多数布局例程仅在二维空间中进行了测试。

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

将节点排列在两条直线中。

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

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

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

在圆上定位节点。

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 Code#

使用TeX/LaTeX中的TikZ库导出NetworkX图形的LaTeX格式。通常,您会希望图形出现在一个figure环境中,因此您可以使用 to_latex(G, caption="一个标题") 。如果您想要原始的绘图命令而没有figure环境,请使用:func:to_latex_raw 。如果您想要写入文件而不是仅仅返回LaTeX代码作为字符串,请使用 write_latex(G, "filename.tex", caption="一个标题")

要构建一个包含每个图形子图的图形,请为 to_latexwrite_latex 提供一个图形列表、一个子标题列表和一个图形中的子图行数。

为了能够在LaTeX中使用 \\ref 引用图形或子图,关键字 latex_label 可用于图形, sub_labels 用于一个标签列表,每个子图一个标签。

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

请通过github告诉我们您希望看到哪些功能,或者更好的是提供一些代码来实现它,或者更好的是创建一个github pull请求来添加该功能。

TikZ方法#

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

tikzpicture环境的选项(例如”[scale=2]”)可以通过关键字参数提供。类似地,默认节点和边选项可以通过关键字参数提供。默认节点选项应用于绘制所有节点(且没有边)的单个TikZ “path”。默认边选项应用于包含每条边的路径的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="一个路径图", latex_label="fig1")
>>> latex_code = nx.to_latex(G)  # 一个字符串而不是文件

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

>>> G = nx.path_graph(4, create_using=nx.DiGraph)
>>> pos = {n: (n, n) for n in G}  # 节点设置在一行上
>>> G.nodes[0]["style"] = "blue"
>>> G.nodes[2]["style"] = "line width=3,draw"
>>> G.nodes[3]["label"] = "停止"
>>> G.edges[(0, 1)]["label"] = "第一步"
>>> G.edges[(0, 1)]["label_opts"] = "near start"
>>> G.edges[(1, 2)]["style"] = "line width=3"
>>> G.edges[(1, 2)]["label"] = "第二步"
>>> G.edges[(2, 3)]["style"] = "green"
>>> G.edges[(2, 3)]["label"] = "第三步"
>>> 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 = ["路径4", "完全图4", "路径8", "完全图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}

Notes#

如果您想要更改图形/文档/子图环境的预设/后设,请使用关键字参数: figure_wrapper , document_wrapper , subfigure_wrapper 。默认值存储在私有变量中,例如 nx.nx_layout._DOCUMENT_WRAPPER

References#

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 上绘制图形。