在NetworkX中更新节点值

1 投票
1 回答
1217 浏览
提问于 2025-04-17 23:16

我在用NetworkX做一个图形。在这个图形里,有一些形状的(x,y)坐标。我想在图里保留正常的(x,y)坐标,这些坐标是从一个形状识别的脚本中得到的,但在绘制图形的时候,我想把它们画成(x, height-y)的位置,其中height是图片的高度。这么做是因为如果我用正常的(x,y)坐标来绘图,形状会显示得颠倒过来。所以我写了以下代码:

#ap is the array containing the (x,y) positions of the shape. x=ap[0][0], y=ap[0][1] and so on.
pe = nx.Graph()
pe.add_node('p1', posxy=(ap[0][0], ap[0][1]))
pe.add_node('p2', posxy=(ap[1][0], ap[1][1]))
pe.add_node('p3', posxy=(ap[2][0], ap[2][1]))
pe.add_node('p4', posxy=(ap[3][0], ap[3][1]))
pe.add_node('p5', posxy=(ap[4][0], ap[4][1]))
pe.add_cycle(['p1','p2','p3','p4','p5'])
positions = nx.get_node_attributes(pe, 'posxy')
nx.draw(pe, positions, labels=positions, font_size=8, font_weight='bold', node_color='yellow', alpha=0.5)

但是当我尝试修改变量positions时,它没有效果。我试着做类似height-'posxy'[1]的操作,只更新posxyy部分,但这不行。它返回了这个错误:unsupported operand type(s) for -: 'int' and 'str',所以我不知道怎么更新节点的属性'posxy'

我该怎么做呢?

任何帮助都很感谢。

1 个回答

1

这个表达式

height - 'posxy'[1]

会计算出

height - 'o'

所以你看到的错误就是这个原因。

根据文档positions会是一个字典,格式是 {节点: 位置, ...}

posxy 是一个元组,比如 (1, 2),元组是不可变的,这意味着你不能直接改变它里面的某个值(比如 posxy[1] = ...);这样做也会出错:

TypeError: 'tuple' object does not support item assignment 

相反,你需要处理所有的值,为每个位置创建一个新的元组,可以使用字典推导式来实现,比如:

positions = {k: (v[0], height - v[1]) for k, v in positions.items()}

撰写回答