图形工具 edge_property 到字符串

Graph-tool edge_property to string

我有一张边权图。我环顾四周,发现我可以使用 edge_properties 来表示边缘权重。我这样做:

edge_weight = g.new_edge_property("double")

for i in range(10):
    e = g.add_edge(i, i+1)
    edge_weight[e] = i

现在我想用给定的边缘权重打印一个图形。你有什么想法如何做到这一点?我唯一能想到的是:

edge_weight = g.new_edge_property("double")
edge_str_weight = g.new_edge_property("string")

for i in range(10):
    e = g.add_edge(i, i+1)
    edge_weight[e] = i
    edge_str_weight[e] = str(i)

graph_draw(g, edge_text=edge_str_weight, output="out.png")

它有效,但它很多余。另外,如果建议将边缘权重存储在其他结构或其他东西中,请随时发表评论:)

也许这是一个打字错误,但对 edge_str_weight 的分配应该引用您当前正在使用的边缘 e

edge_str_weight[e] = str(i)

除此之外,使用 属性 地图通常是图形工具的最佳选择。如果出于某种原因你想使用一次性 属性-map 只是为了绘图目的,你将再次需要创建一个:

edge_alt_str_weights = g.new_edge_property("string")
for edge in g.edges():
    edge_alt_str_weights[edge] = str(edge_weight[edge])

您可能还想将计划保留的 属性 地图定义为 internal,以备不时之需。

原则上,不需要创建不同的 属性,因为将在 graph_draw() 中转换为字符串。但是,graph-tool 默认使用十六进制浮点表示法,因为它可以完美表示。这非常适合将值存储在文件中,但不适合显示它们。因此你的做法是正确的。您也许可以使用 map_property_values():

更简洁有效地完成它
label = g.new_edge_property()
map_property_values(edge_weight, label, lambda w: str(w))

graph_draw(g, edge_text=label, output="out.png"))