绘图#
NetworkX 提供基本的图可视化功能,但其主要目标是实现图分析而非图可视化。未来,图可视化功能可能会从 NetworkX 中移除,或者仅作为附加包提供。
专业的图可视化是困难的,我们强烈建议人们使用专门的工具来可视化他们的图。著名的专用且功能齐全的图可视化工具包括 Cytoscape, Gephi, Graphviz,以及用于 LaTeX 排版的 PGF/TikZ。要使用这些或其他类似工具,您应该将 NetworkX 图导出为这些工具可读的格式。例如,Cytoscape 可以读取 GraphML 格式,因此 networkx.write_graphml(G, path)
可能是一个合适的选择。
- 这里提供的更多功能信息可在以下链接找到:
matplotlib: https://matplotlib.net.cn/
pygraphviz: http://pygraphviz.github.io/
Matplotlib#
使用 matplotlib 绘制网络。
示例#
>>> G = nx.complete_graph(5)
>>> nx.draw(G)
另请参见#
|
使用 Matplotlib 绘制图 G。 |
|
使用 Matplotlib 绘制图 G。 |
|
绘制图 G 的节点。 |
|
绘制图 G 的边。 |
|
在图 G 上绘制节点标签。 |
|
绘制边标签。 |
|
以环状布局绘制图 |
|
以 Kamada-Kawai 力导向布局绘制图 |
|
以平面布局绘制平面 NetworkX 图 |
|
以随机布局绘制图 |
|
以谱二维布局绘制图 |
|
以弹簧布局绘制图 |
|
以壳层布局绘制 NetworkX 图 |
Graphviz AGraph (dot)#
pygraphviz AGraph 类的接口。
示例#
>>> G = nx.complete_graph(5)
>>> A = nx.nx_agraph.to_agraph(G)
>>> H = nx.nx_agraph.from_agraph(A)
另请参见#
Pygraphviz: http://pygraphviz.github.io/
Graphviz: https://graphviz.cpp.org.cn
|
从 PyGraphviz 图返回一个 NetworkX Graph 或 DiGraph。 |
|
从 NetworkX 图 N 返回一个 pygraphviz 图。 |
|
将 NetworkX 图 G 以 Graphviz dot 格式写入到路径 path。 |
|
从路径 path 上的 dot 文件返回一个 NetworkX 图。 |
|
使用 Graphviz 为 G 创建节点位置。 |
|
使用 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)
另请参见#
pydot: erocarrera/pydot
Graphviz: https://graphviz.cpp.org.cn
|
从 Pydot 图返回一个 NetworkX 图。 |
|
从 NetworkX 图 N 返回一个 pydot 图。 |
|
将 NetworkX 图 G 以 Graphviz dot 格式写入到路径 path。 |
|
从指定路径的 dot 文件返回一个 NetworkX |
|
使用 Pydot 和 Graphviz 创建节点位置。 |
|
使用 |
图布局#
用于图绘图的节点定位算法。
对于 random_layout()
,可能的最终形状是边长为 [0, scale] 的正方形(默认值:[0, 1])。更改 center
会将布局偏移该量。
对于其他布局例程,范围是 [center - scale, center + scale](默认值:[-1, 1])。
警告:大多数布局例程仅在二维环境中测试过。
|
NetworkX 的 Arf 布局 |
|
将节点放置在两条直线上。 |
|
根据广度优先搜索算法定位节点。 |
|
将节点放置在圆周上。 |
|
使用 ForceAtlas2 力导向布局算法定位节点。 |
|
使用 Kamada-Kawai 路径长度代价函数定位节点。 |
|
定位节点使边不相交。 |
|
在单位正方形内随机均匀地定位节点。 |
|
将位置数组缩放到所有轴上的 (-scale, scale)。 |
|
返回一个以节点为键的缩放位置字典 |
|
将节点放置在同心圆中。 |
|
使用 Fruchterman-Reingold 力导向算法定位节点。 |
|
使用图拉普拉斯矩阵的特征向量定位节点。 |
|
以螺旋布局定位节点。 |
|
将节点分层放置在直线上。 |
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_latex
或 write_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
|
返回绘制 |
|
返回绘制 |
|
将绘制图的 LaTeX 代码写入到 |