如何使用NetworkX绘制同时显示多个边属性(上下排列)的图?
解决NetworkX边标签同时显示两个属性并上下排列的问题
没问题,这事儿好办!你遇到的问题确实是因为nx.get_edge_attributes只能提取单个属性,但我们完全可以手动构建包含两个属性的标签字典,用换行符来实现上下排列的效果。
核心思路
遍历图中所有边,把每条边的mark和cable_name属性用换行符\n拼接成一个字符串,然后用这个自定义的字典来绘制边标签就行。这样matplotlib会自动识别换行符,把两个属性上下显示。
修改后的完整代码
import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() G.add_edge(1, 2, mark='200', cable_name='К300') # 多加一条边测试效果 G.add_edge(2, 3, mark='300', cable_name='К400') pos = nx.spring_layout(G, scale=2) # 手动构建包含双属性的边标签字典 edge_labels = {} for u, v, data in G.edges(data=True): # 用get方法避免边缺少属性时报错 mark = data.get('mark', '') cable_name = data.get('cable_name', '') # 用\n实现两个属性上下排列 edge_labels[(u, v)] = f"{mark}\n{cable_name}" # 先绘制图的节点和边 nx.draw(G, pos, with_labels=True, nodecolor='r', edge_color='b', node_size=700, font_size=12) # 绘制自定义边标签,可调整参数优化显示 nx.draw_networkx_edge_labels( G, pos, edge_labels=edge_labels, label_pos=0.5, # 标签放在边的中间位置 font_size=10 # 调整标签字号适配换行 ) plt.show()
关键细节说明
- 换行实现:通过
\n拼接两个属性,matplotlib会自动将文本拆分为两行显示,完美实现上下排列的需求。 - 鲁棒性处理:用
data.get('属性名', '')代替直接取data['属性名'],这样如果某条边缺少其中一个属性,代码也不会崩溃,只会显示空字符串。 - 显示优化:调整
node_size、font_size和label_pos等参数,让整体布局更美观,标签位置更合理。
如果之后需要更复杂的标签样式(比如不同属性用不同颜色),可以考虑用matplotlib的text对象手动绘制每条边的标签,但对于你的需求来说,上面的方法已经足够简单高效了。
内容的提问来源于stack exchange,提问作者Sib
相关产品推荐
相关产品推荐

