0

我有一个带有边权重的图表。我环顾四周,发现我可以使用 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")

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

4

2 回答 2

1

原则上,不需要创建不同的属性,因为将在内部进行到字符串的转换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"))
于 2015-09-25T06:55:53.483 回答
1

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

edge_str_weight[e] = str(i)

除此之外,使用属性图通常是图形工具的最佳选择。如果出于某种原因您只想使用一次性属性映射来进行绘图,您将再次需要创建一个:

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

您可能还想将您计划保留的属性映射定义为内部的,以防您想要持久使用它们。

于 2015-09-24T20:43:24.797 回答