2015-09-24 1 views
0

У меня есть график с весами краев. Я огляделся и обнаружил, что я могу использовать edge_properties для представления веса края. Я делаю это так:Графический инструмент edge_property для строки

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") 

Это работает, но это совершенно излишне. Кроме того, если он предложил, чтобы сохранить вес края в другой структуре или что-то, не стесняйтесь комментировать :)

ответ

1

В принципе, нет необходимости создавать другое свойство, так как преобразование в строку будет сделано внутри graph_draw(). Тем не менее, графический инструмент по умолчанию использует шестнадцатеричную поплавковую нотацию, поскольку он обеспечивает идеальное представление. Это идеально подходит для хранения значений в файле, но не для их отображения. Поэтому ваш подход правильный. Вы можете сделать это более лаконично и эффективно, используя 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")) 
+0

Принял ваш ответ за использование map_property_values, я узнал от него что-то новое :) Спасибо. –

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]) 

Вы также можете определить свойство карты, которые вы планируете держать вокруг, как internal, если вы хотите использовать их настойчиво.

+0

Да, это была просто опечатка. Я не думал о создании edge_str_weight так, как вы предполагали, но выглядит круто. Я отвечу на ваш ответ, если никто другой не поможет. –

+0

Если по какой-то причине вы ** def ** не хотите поддерживать строчную версию своих весов, просто создайте карту свойств на лету *** и не интернализуйте ее ***, вы должны интернализировать отдохнуть. По крайней мере, так я бы это сделал :-) –

Смежные вопросы