Python 网络图怎么画 NetworkX库绘制节点与关系拓扑图|Duuu笔记
不是必须但几乎总是需要导入 matplotlib.pyplot 并调用 plt.show();nx.draw_networkx() 更常用且省心,适合教学调试;中文显示需配置 font.sans-serif;布局算法如 spring_layout 适用于小图。
NetworkX 画图前必须调用
matplotlib.pyplot
吗?
不是必须,但几乎总是需要——因为
networkx.draw()
本身不显示图像,只调用 Matplotlib 的底层绘图逻辑。不导入
matplotlib.pyplot
或不调用
plt.show()
,你会看到“没报错但没图”的静默失败。
常见错误现象:
RuntimeWarning: No artists with labels found to put in legend.
或直接无输出;Jupyter 中单元格执行完一片空白。
必须显式导入:
import matplotlib.pyplot as plt
绘图后必须加
plt.show()
(脚本中)或依赖 Jupyter 自动渲染(但建议仍写上,避免跨环境失效)
若用
plt.figure(figsize=(8,6))
提前设画布,记得在
draw()
前调用,否则可能被忽略
nx.draw()
和
nx.draw_networkx()
选哪个?
nx.draw_networkx()
是更常用、更省心的封装,它默认启用节点标签、边权重提示、交互友好布局;而
nx.draw()
更底层,适合批量出图或嵌入 GUI,但默认不画节点名、不自动适配字体大小。
使用场景:快速验证拓扑结构、教学演示、调试关系连通性 → 优先用
nx.draw_networkx()
;生成高清 SVG 用于文档、或需精确控制每条边颜色/宽度 → 可切回
nx.draw()
配合参数逐项设置。
“
Python免费学习笔记(深入)
”;
nx.draw_networkx(G)
自动调用
nx.draw_networkx_nodes()
+
nx.draw_networkx_edges()
+
nx.draw_networkx_labels()
想关掉节点标签?传
with_labels=False
,别试图删
labels
参数——它不存在于
draw()
性能影响:二者底层一致,但
draw_networkx()
多一次字典遍历取 label,默认开销可忽略
中文节点名显示为方块?字体路径和
font_family
怎么设
Matplotlib 默认不支持中文字体,
nx.draw_networkx()
用的是
matplotlib.rcParams['font.family']
,不改就只能显示方块。
Action Figure AI
借助Action Figure AI的先进技术,瞬间将照片转化为定制动作人偶。
下载
关键不是装字体,而是让 Matplotlib “知道”系统里有可用中文字体。Windows 用户常误以为 SimHei 就行,其实得确认该字体文件真实存在且被 Matplotlib 缓存识别。
先运行
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
看返回列表里有没有中文字体路径
临时生效:在绘图前加
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'KaiTi']
(顺序重要,前面优先)
永久生效:修改
matplotlib.matplotlib_fname()
返回的
matplotlibrc
文件,设
font.sans-serif:
行
注意:Jupyter 中改 rcParams 后需重启内核才对后续 cell 生效
图太挤/节点重叠/边线缠绕——布局算法怎么选
NetworkX 不画图,只算坐标。
nx.spring_layout()
(默认)适合小图(nx.kamada_kawai_layout() 对称美观但计算慢;真正实用的是
nx.nx_agraph.graphviz_layout()
(需安装 Graphviz),它能导出清晰的层级/树状结构。
使用场景:社交网络小样本分析 →
spring_layout(k=1.5, iterations=50)
;组织架构图 →
graphviz_layout(G, prog='dot')
;电路拓扑或流程图 →
shell_layout()
分圈排布。
k
参数控制节点间斥力强度,值越大越分散(但太大反而飞散)
seed
必须设(如
seed=42
),否则每次运行坐标不同,不利于对比调试
兼容性坑:Graphviz 在 Windows 上要手动配环境变量
PATH
到
dot.exe
所在目录,Mac/Linux 用
brew install graphviz
或
apt install graphviz
最常被忽略的一点:NetworkX 本身不校验节点 ID 类型。如果你用字典键做节点名,又混入
None
或浮点数当 ID,某些 layout 函数(比如
planar_layout
)会直接抛
NetworkXException
,错误信息里却不会告诉你哪条数据有问题——得自己先
assert all(isinstance(n, (str, int)) for n in G.nodes())
。
