ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

NetworkX 图形绘制(Drawing)完全指南:从 Matplotlib 基础绘图到 Graphviz、iplotx 与 LaTeX 生态集成

NetworkX 图形绘制(Drawing)完全指南:从 Matplotlib 基础绘图到 Graphviz、iplotx 与 LaTeX 生态集成 图计算数据分析科学计算【免费下载链接】networkxNetwork Analysis in Python项目地址https://gitcode.com/gh_mirrors/ne/networkx点击查看免费下载导读本文聚焦 NetworkX 的drawing模块源码位于 networkx/drawing系统讲解其内置的 Matplotlib 绘图 API、节点布局算法layout以及如何将图导出到 GraphvizDOT、iplotx、Hiveplotlib、LaTeX/TikZ 等专业可视化生态。读完本文你将掌握nx.draw系列函数的核心参数、十余种布局算法的适用场景以及把 NetworkX 图无缝桥接到外部渲染引擎的完整工作流从而在图分析与图可视化之间做出正确的技术选型。需要先说明的是NetworkX 的定位是图分析而非图可视化见 doc/reference/drawing.rst 开篇声明。它提供的绘图功能是够用就好的基础能力未来甚至可能被移除或改为独立附加包。因此本文一方面完整讲解内置绘图能力另一方面也会给出何时应该把图交给专业工具的清晰判断标准。一、定位与选型NetworkX 绘图能做什么、不能做什么1.1 官方定位分析优先可视化为辅从 doc/reference/drawing.rst 可以明确读到官方立场NetworkX provides basic functionality for visualizing graphs, but its main goal is to enable graph analysis rather than perform graph visualization.这意味着networkx.drawing提供的是基础可视化功能而真正的目标是支撑图分析。官方甚至警告在未来版本中可视化功能可能从 NetworkX 移除或仅作为附加包提供。1.2 什么时候应该交给专业可视化工具好的图可视化很难Proper graph visualization is hard官方明确推荐在需要高质量可视化时使用专门工具包括Cytoscape生物网络分析利器可直接读取 GraphML 格式Gephi交互式图探索与可视化GraphvizDOT 语言驱动的经典布局引擎Hiveplotlib蜂巢图hive plot绘制iplotx基于 Matplotlib 的扩展样式绘制PGF/TikZ面向 LaTeX 排版的图绘制数据导出桥接是使用这些工具的标准路径先导出为对方可读的格式再由外部工具渲染。例如 Cytoscape 能读取 GraphML那么networkx.write_graphml(G, path)就是最合适的衔接调用GraphML 读写实现在 networkx/readwrite/graphml.py。特别提示文档中的 tip 明确指出iplotx与hiveplotlib可以直接接收 NetworkX 原生数据结构图对象无需导出为文件即可绘图。这意味着这两类工具与 NetworkX 的集成最为顺滑。1.3 绘图模块全景networkx/drawing目录下共五个核心模块见 networkx/drawing/init.py模块文件职责依赖nx_pylab.pyMatplotlib 绘图draw系列matplotliblayout.py节点布局算法返回pos字典numpynx_agraph.pyGraphviz 桥接pygraphviz/AGraphpygraphviz、graphviznx_pydot.pyGraphviz 桥接pydotpydot、graphviznx_latex.py导出 LaTeX/TikZ 代码无纯文本生成注意这些模块的依赖均为可选依赖绘图前需确保对应依赖已安装参考 requirements/extra.txt 中的可选依赖声明。二、Matplotlib 绘图draw系列函数全解2.1 公共 API 一览nx_pylab.py的__all__见 nx_pylab.py声明了以下公共函数display在画布canvas上显示图apply_matplotlib_colors从 matplotlib colormap 计算颜色并写回图属性draw快速绘图入口draw_networkx全功能绘图入口draw_networkx_nodes/draw_networkx_edges/draw_networkx_labels/draw_networkx_edge_labels分层绘制节点、边、标签draw_bipartite/draw_circular/draw_kamada_kawai/draw_planar/draw_random/draw_spectral/draw_spring/draw_shell/draw_forceatlas2绑定固定布局的便捷绘图2.2nx.draw最简入口draw(G, posNone, axNone, **kwds)定义见 nx_pylab.py是官方示例中最常用的快速入口import networkx as nx G nx.dodecahedral_graph() nx.draw(G) # 不传 pos自动使用 spring layout nx.draw(G, posnx.spring_layout(G)) # 显式指定布局其内部行为从源码可以拆解出几个关键点画布处理未传ax时使用plt.gcf()获取当前 figure并把facecolor设为白色若无坐标轴则通过cf.add_axes((0, 0, 1, 1))创建全图区坐标轴。默认不带标签draw是简洁模式默认不画节点/边标签、不显示坐标轴刻度绘制后调用ax.set_axis_off()。标签开关联动with_labels默认值由labels in kwds推断——即只要你传入了labels字典就会自动开启标签绘制见源码 L1175-L1176。命名冲突警告draw与pylab.draw/pyplot.draw同名from networkx import *时可能覆盖后者。源码 Notes 中建议区分使用import matplotlib.pyplot as plt nx.draw(G) # networkx 的 draw() plt.draw() # pyplot 的 draw()2.3nx.draw_networkx全功能入口与核心参数draw_networkx(G, posNone, arrowsNone, with_labelsTrue, **kwds)nx_pylab.py是参数最完整的绘制函数。它通过inspect.signature动态校验关键字参数源码 L1335-L1357任何不属于draw_networkx_nodes、draw_networkx_edges、draw_networkx_labels的参数都会抛出ValueError从机制上避免了拼错参数名静默忽略的问题。核心参数表均来自源码 docstring参数默认值说明posNone自动 spring节点位置字典键为节点、值为二维坐标arrowsNoneNone有向图用FancyArrowPatch画箭头、无向图用LineCollection更快True强制画箭头False全部用 LineCollectionarrowstyle-|有向图箭头样式无向图默认-详见matplotlib.patches.ArrowStylearrowsize10箭头长度与宽度可传列表分别设置with_labelsTrue是否绘制节点标签nodelist/edgelistlist(G)/list(G.edges())只绘制指定节点/边node_size300节点大小数组需与 nodelist 等长node_color#1f78b4节点颜色数值序列会被 cmap/vmin/vmax 映射node_shapeo节点形状取自so^vdph8alphaNone节点与边透明度cmap/vmin/vmaxNone节点颜色映射的 colormap 与数值范围width1.0边线宽可传数组逐边设置edge_colork边颜色可用edge_cmap/edge_vmin/edge_vmax映射stylesolid边线型-、--、-.、:font_size/font_color/font_weight/font_family12边 10/k/ normal / sans-serif标签文本样式labelNone图例标签hide_ticksTrue隐藏坐标轴刻度与刻度标签设为False恢复 pyplot 默认axNone指定 Matplotlib 坐标轴对象组合使用示例节点按度着色、边按权重着色import matplotlib.pyplot as plt G nx.dodecahedral_graph() degrees dict(G.degree()) nx.draw_networkx( G, posnx.spring_layout(G, seed42), nodelistlist(degrees), node_size[v * 100 for v in degrees.values()], node_colorlist(degrees.values()), cmapplt.cm.viridis, with_labelsFalse, ) plt.axis(off)2.4 分层绘制节点、边、标签的细粒度控制draw_networkx内部实质是依次调用三个子函数源码 L1366-L1369你完全可以分步调用以获得最大控制力draw_networkx_nodes(G, pos, nodelist, node_size, node_color, node_shape, alpha, cmap, vmin, vmax, ax, linewidths, edgecolors, label, margins, hide_ticks)nx_pylab.py仅绘制节点底层对应matplotlib.pyplot.scatter的 marker 体系linewidths控制节点描边宽度edgecolors控制描边颜色默认与节点同色。draw_networkx_edges(G, pos, edgelist, ...)nx_pylab.py仅绘制边支持arrows、arrowstyle、width、edge_color、style、connectionstyle弯曲边等。draw_networkx_labels(G, pos, labels, ...)nx_pylab.py与draw_networkx_edge_labels(G, pos, edge_labels, ...)nx_pylab.py分别绘制节点与边的文本标签labels/edge_labels为{对象: 文本}字典。分步绘制的典型收益可以只画一次边、多次叠加不同子集的节点实现高亮社团这类效果。2.5 布局绑定便捷函数nx_pylab.py提供了一组与布局一一对应的便捷函数等价于draw(G, pos对应布局(G))见 nx_pylab.py函数绑定布局draw_bipartitebipartite_layoutdraw_circularcircular_layoutdraw_kamada_kawaikamada_kawai_layoutdraw_planarplanar_layoutdraw_randomrandom_layoutdraw_spectralspectral_layoutdraw_springspring_layoutdraw_shellshell_layoutdraw_forceatlas2forceatlas2_layout2.6 颜色辅助apply_matplotlib_colorsapply_matplotlib_colors(G, src_attr, dest_attr, map, vminNone, vmaxNone, nodesTrue)nx_pylab.py读取图中的数值属性经 colormap 映射为 RGBA 颜色后写回图属性。源码细节nodesTrue时读取节点属性否则读取边属性多重图场景边属性读取使用G.edges(keysTrue)。vmin/vmax缺省时自动取属性最小/最大值。底层用mpl.cm.ScalarMappableset_clim实现映射并通过nx.set_node_attributes/nx.set_edge_attributes写回。典型用途为按数值着色的自定义绘图预计算颜色并存入图对象供后续多次渲染复用。三、布局算法networkx.drawing.layout深度解析3.1 布局函数的统一约定layout.py模块layout.py的__all__共 15 个函数。所有布局函数返回pos字典节点 → 坐标元组。模块 docstring 明确了两个关键约定源码 L8-L15random_layout()的结果范围是[0, scale]的正方形默认[0, 1]center会平移整体布局其他布局的结果范围是[center - scale, center scale]默认[-1, 1]警告大多数布局只经过二维测试dim2。_process_params(G, center, dim)layout.py是所有布局的公共预处理接受Graph或节点列表center缺省为原点center维度与dim不一致时抛出ValueError。3.2 各布局算法速查函数算法/原理适用场景random_layout各坐标在[0,1)均匀随机layout.py基线对比、快速占位circular_layout节点均匀分布在圆上layout.py展示环路、对称结构shell_layout按nlist分壳层环状分布layout.py分层/分组结构bipartite_layout二部图左右分列layout.py二部图、投射图spring_layoutFruchterman-Reingold 力导向layout.py通用默认首选kamada_kawai_layoutKamada-Kawai 力导向基于最短路径距离layout.py强调图距离结构spectral_layout图 Laplacian 特征向量定位layout.py对称/规则图planar_layout无交叉边嵌入layout.py平面图spiral_layout对数螺旋分布layout.py大环图、长链结构multipartite_layout按subset属性分层排列layout.py多部图arf_layoutArf 力导向参数a1.1、etol1e-6layout.py快速大图近似布局forceatlas2_layoutGephi 同款 ForceAtlas2max_iter100、jitter_tolerance1.0layout.py社区结构清晰的大图bfs_layoutBFS 分层定位layout.py树/层次展示rescale_layout/rescale_layout_dict缩放坐标到(-scale, scale)layout.py坐标归一化3.3 关键参数与可复现性spring_layout核心参数layout.pyk节点间最优距离默认与节点数相关kNone时自动计算pos初始位置字典可迭代优化fixed固定位置的节点列表iterations迭代次数默认 50weight边权重属性名默认weightseed随机种子。可复现性random_layout、spring_layout、forceatlas2_layout等接受seed参数内部经np_random_state装饰器处理见 layout.py传入整数种子即可获得确定性布局这对论文插图、测试复现至关重要。store_pos_as参数random_layout、circular_layout、shell_layout、spectral_layout、spiral_layout、multipartite_layout、bfs_layout等支持store_pos_as——非 None 时会把布局结果写入图属性G.nodes[...][store_pos_as]函数仍返回pos字典见 layout.py。bipartite_layout的nodes参数传入二部图某一分区的节点集合两侧节点会沿坐标轴分别排布。3.4 布局与绘制解耦布局与绘制是解耦的两步布局函数只算坐标绘制函数只消费坐标。这意味着你可以用任意布局包括第三方布局生成pos微调/裁剪pos配合rescale_layout归一化多次调用不同的draw_networkx_*叠加绘制。这也是 NetworkX 绘图架构的核心设计——pos字典是连接布局与渲染的唯一契约。四、Graphviz 集成DOT 格式的两种桥接方案Graphviz 是文档明确推荐的完全功能可视化工具之一。NetworkX 提供两条并行通道pygraphvizAGraph与pydot两者功能等价按依赖偏好二选一即可。4.1 方案一nx_agraphpygraphviz模块__all__nx_agraph.pyfrom_agraph、to_agraph、write_dot、read_dot、graphviz_layout、pygraphviz_layout、view_pygraphviz。基础往返示例模块 docstring 官方示例G nx.complete_graph(5) A nx.nx_agraph.to_agraph(G) # NetworkX → AGraph H nx.nx_agraph.from_agraph(A) # AGraph → NetworkXfrom_agraph的类型推断nx_agraph.py未指定create_using时按 AGraph 的is_directed()与is_strict()组合自动推断为DiGraph/MultiDiGraph/Graph/MultiGraph。转换过程中图默认属性存入G.graph_attrGraphviz 的 graph/node/edge 默认属性分别挂到G.graph[graph]、G.graph[node]、G.graph[edge]节点/边属性原样映射为 NetworkX 属性节点名转为字符串非多重图时边名e.name会存为key属性源码 L99-L100。graphviz_layout(G, progneato, rootNone, args)nx_agraph.py调用 Graphviz 布局引擎生成坐标。prog默认neato常用取值还包括dot层次布局、circo、twopi、fdpargs可透传 Graphviz 命令行参数。返回的pos字典可直接喂给nx.draw。view_pygraphviz(G, progdot)调用系统默认查看器直接渲染 DOT 文件——无需任何布局计算是最快的看一眼方案。4.2 方案二nx_pydotpydot模块__all__nx_pydot.pywrite_dot、read_dot、graphviz_layout、pydot_layout、to_pydot、from_pydot。基础往返示例模块 docstring 官方示例G nx.complete_graph(5) PG nx.nx_pydot.to_pydot(G) # NetworkX → pydot.Dot H nx.nx_pydot.from_pydot(PG) # pydot.Dot → MultiGraph默认read_dot/write_dot的文件能力nx_pydot.pywrite_dot(G, path)把图写成 DOT 文本文件名以.gz/.bz2结尾时自动压缩经open_file装饰器。read_dot(path)读取 DOT 文件并返回MultiGraph或MultiDiGraph多重图推断规则非 strict 的 graph 视为多重图见from_pydot源码 L121-L130若文件含多个图只取第一个。想得到普通Graph需显式转换G nx.Graph(nx.nx_pydot.read_dot(path))。pydot_layout(G, progneato, rootNone)与pygraphviz_layout等价通过 pydot 驱动 Graphviz 布局。4.3 两条通道如何选择已安装 pygraphviz → 用nx_agraphAPI 更贴近 AGraph且支持view_pygraphviz直接预览已安装 pydot → 用nx_pydot纯 Python 解析无编译依赖安装更省事两者产出的 DOT 文件完全兼容 Graphviz 生态可进一步交给dot命令行或 Gephi 等工具。五、iplotx 与 Hiveplotlib直接消费 NetworkX 原生对象的现代方案文档特别强调这两个库无需文件导出直接接收 NetworkX 图对象官方示例可直接复现。5.1 iplotxMatplotlib 之上的扩展样式iplotx 基于 Matplotlib 提供扩展样式绘制。官方示例见 doc/reference/drawing.rstimport iplotx as ipx G nx.cycle_graph(5, create_usingnx.DiGraph) layout nx.circular_layout(G) ipx.network(G, layoutlayout, vertex_facecolor[tomato, gold])要点布局仍由nx.circular_layout计算pos字典但渲染交给ipx.network可通过vertex_facecolor等参数逐节点定制颜色。仓库示例 examples/external/plot_iplotx.py 展示了完整用法。5.2 Hiveplotlib可复现的蜂巢图蜂巢图hive plot设计思想源自 doc/reference/drawing.rst节点按分区变量分布到数条径向轴上再按排序变量在轴内排序。位置由数据决定而非布局算法因此结果完全可复现且图的结构属性直接可读。官方示例创建 3 块随机块模型 按 pagerank 排序from hiveplotlib import HivePlot p [[0.3, 0.005, 0.0], [0.005, 0.3, 0.03], [0.0, 0.03, 0.3]] G nx.stochastic_block_model(sizes[15, 15, 15], pp, seed0) hp HivePlot( graphG, partition_variableblock, # 节点按 block 属性分轴 sorting_variablespagerank, # 轴内按 pagerank 排序 node_graph_metricspagerank, # 计算节点 pagerank 驱动布局 repeat_axesTrue, ) hp.plot()node_graph_metricspagerank体现了两者深度集成NetworkX 的节点/边度量如nx.pagerank可在布局时实时计算并驱动轴内排序。默认用 Matplotlib 渲染也可输出到 Bokeh、Plotly、HoloViews大图可用 Datashader 栅格化。仓库示例见 examples/external/plot_hiveplotlib.py。六、LaTeX 输出把 NetworkX 图变成 TikZ 代码nx_latex.py模块nx_latex.py把图导出为基于 TikZ 的 LaTeX 代码是论文排版场景的直通车。三个核心函数to_latex(G, caption..., as_document...)返回 LaTeX 字符串可含 figure 环境to_latex_raw(G)只返回 TikZ 绘制命令无 figure 环境write_latex(G, filename.tex, caption..., as_document...)直接写文件。基础用法模块 docstring 官方示例from pathlib import Path import tempfile tmp_path Path(tempfile.gettempdir()) G nx.path_graph(3) # 生成独立可编译文档 fpath tmp_path / just_my_figure.tex nx.write_latex(G, fpath, as_documentTrue)生成的独立文档结构完整示例可直接编译\documentclass{report} \usepackage{tikz} \usepackage{subcaption} \begin{document} \begin{figure} \begin{tikzpicture} \draw (0.0:2) node (0){0} (120.0:2) node (1){1} (240.0:2) node (2){2}; \begin{scope}[-] \draw (0) to (1); \draw (1) to (2); \end{scope} \end{tikzpicture} \end{figure} \end{document}嵌入已有文档as_documentFalse只输出 figure 环境配合caption图题与latex_label\label引用名可用\ref交叉引用nx.write_latex(G, fpath, as_documentFalse, captionP3, latex_labelfig1)多子图subfigureto_latex/write_latex可接收图列表、子图题列表与行数生成含多个 subfigure 的 figure每个子图可用sub_labels指定\label。样式定制机制The TikZ approach见 nx_latex.py绘制选项既可存在图属性中也可通过node_options/edge_options字典按节点/边传入 TikZ 选项字符串标签同理存在节点/边属性或通过node_label/edge_label字典按对象传入文本tikzpicture环境选项如[scale2]与默认节点/边选项均可经关键字参数传入默认节点选项作用于绘制全部节点的单条 path默认边选项作用于包住每条边的 scope。官方路线图模块 docstring 说明未来计划提供 TikZ Graph 接口含布局算法。七、实战工作流从分析到成图的一条龙方案结合以上所有能力一个完整的分析 → 选型 → 成图决策流程如下快速检查阶段nx.draw(G)或nx.draw(G, posnx.spring_layout(G, seed0))足以看个大概无需额外依赖。结构洞察阶段按图的类型选择布局——平面图用planar_layout社区结构用forceatlas2_layout/spring_layout层次结构用bfs_layout/multipartite_layout大环图用spiral_layout并固定seed保证可复现。精细定制阶段用draw_networkx_nodes/draw_networkx_edges/draw_networkx_labels分层渲染配合apply_matplotlib_colors实现按属性着色有向图用arrowsTruearrowstyle定制箭头。对外交付阶段论文排版 →write_latex(..., as_documentTrue)生成 TikZDOT 生态Graphviz 命令行、Gephi→nx_pydot.write_dot/nx_agraph.write_dot交互式探索 → 导出 GraphML 交给 Cytoscapenx.write_graphml需要专业布局且要 NetworkX 度量参与 →HivePlot(graphG, ...)或ipx.network(G, layout...)。八、小结NetworkX 的drawing模块是一套定位克制但功能完整的绘图设施draw系列覆盖从快速预览到精细分层渲染的全过程layout模块提供 15 种布局算法与确定性种子支持nx_agraph/nx_pydot双通道打通 Graphviz 生态nx_latex直达论文排版iplotx 与 Hiveplotlib 则代表了直接消费 NetworkX 原生对象的现代集成方式。理解NetworkX 主攻分析、可视化交给专业工具这一官方立场你就能在快速验证与高质量交付之间做出恰当取舍让图可视化真正服务于图分析本身。延伸阅读绘图相关示例位于 examples/drawing含节点着色、多图、标签布局等与 examples/externaliplotx、hiveplotlib、igraph 等外部集成Matplotlib 绘图与布局的完整函数签名可直接查阅 nx_pylab.py 与 layout.py 的 docstring。赞分享图计算数据分析科学计算【免费下载链接】networkxNetwork Analysis in Python项目地址https://gitcode.com/gh_mirrors/ne/networkx点击查看免费下载相关推荐Heapster 源码深度剖析Go语言实现的监控系统架构设计Heapster 源码深度剖析Go语言实现的监控系统架构设计 Heapster是Kubernetes生态系统中一个重要的容器集群监控工具它负责收集、处理和存运维后端Fabric.js图形编辑完全指南从基础绘制到高级交互Fabric.js图形编辑完全指南从基础绘制到高级交互 Fabric.js作为功能强大的JavaScript Canvas库为开发者提供了完整的图形编辑解决前端图形学探索 LaTeX 绘图的艺术Awesome LaTeX Drawing探索 LaTeX 绘图的艺术Awesome LaTeX Drawing 在这个数字时代高质量的绘图和图表对于学术研究、教学以及文档制作至关重要。 是一个精心上一篇避坑必读proposal-operator-overloading 常见错误的 7 个解决方案含性能陷阱与最佳实践下一篇Pjax vs jQuery-Pjax为什么这款轻量级库能彻底改变你的网站性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表