如何将Geodesic距离取整至最近米数?解决NetworkX绘图混乱问题
解决NetworkX边权重(Geodesic距离)绘图时小数过长的问题
问题根源
你碰到的报错是因为geodesic不是Python原生的数值类型,没法直接用round()或者numpy的np.round()处理,得先把它转成float/int这类可计算的数值格式。
三种可行解决方案
1. 生成边属性时直接处理
在设置边的距离属性时,就把Geodesic距离转成浮点型并截取小数位:
# 替换你原本添加边权重的逻辑 for u, v in map.edges(): # 这里是你计算Geodesic距离的代码 geo_dist = 你的距离计算逻辑 # 转成float后保留3位小数 rounded_dist = round(float(geo_dist), 3) map.edges[u, v]['distance'] = rounded_dist
2. 批量修改已有的边属性
如果已经生成了带geodesic对象的边属性,直接遍历批量转换:
for u, v, attrs in map.edges(data=True): attrs['distance'] = round(float(attrs['distance']), 3)
3. 仅在绘图时格式化显示(不改动原始数据)
要是不想修改原始权重,只在绘图标签里做格式化:
import networkx as nx import matplotlib.pyplot as plt # 选个合适的布局 pos = nx.spring_layout(map) # 绘制节点和标签,可调整大小避免遮挡 nx.draw(map, pos, with_labels=True, node_size=700, font_size=10) # 格式化边标签,保留3位小数 edge_labels = {(u, v): round(float(d['distance']), 3) for u, v, d in map.edges(data=True)} nx.draw_networkx_edge_labels(map, pos, edge_labels=edge_labels, font_size=8) plt.show()
额外调整技巧
- 要取整的话,把
round(float(g), 3)改成int(float(g))就行 - 还能通过调整
node_size、font_size参数,进一步解决节点名称被遮挡的问题
内容的提问来源于stack exchange,提问作者Xemnas
相关产品推荐
相关产品推荐

