Как Python может написать точечный файл для GraphViz с просьбой, чтобы некоторые края были окрашены в красный цвет?

Я использую код Python (с вложенными в Python диктовками), чтобы написать файл DOT для GraphViz, чтобы нарисовать мой ориентированный граничный взвешенный граф, благодаря предложениям DAWG...

nestedg={1: {2: 3, 3: 8, 5: -4}, 
     2: {4: 1, 5: 7}, 
     3: {2: 0.09}, 
     4: {1: 2, 3: -5}, 
     5: {4: 6}}

with open('/tmp/graph.dot','w') as out:
    for line in ('digraph G {','size="16,16";','splines=true;'):
        out.write('{}\n'.format(line))  
    for start,d in nestedg.items():
        for end,weight in d.items():
              out.write('{} -> {} [ label="{}" ];\n'.format(start,end,weight))
    out.write('}\n')

Который производит этот файл.DOT, из которого GraphViz может создать хорошее графическое изображение:

digraph G {
size="16,16";
splines=true;
1 -> 2 [ label="3" ];
1 -> 3 [ label="8" ];
1 -> 5 [ label="-4" ];
2 -> 4 [ label="1" ];
2 -> 5 [ label="7" ];
3 -> 2 [ label="0.09" ];
4 -> 1 [ label="2" ];
4 -> 3 [ label="-5" ];
5 -> 4 [ label="6" ];
}

ВОПРОС: Как я могу изменить этот код Python, чтобы попросить GraphViz закрасить ребро КРАСНЫМ, если его вес меньше определенного числа (например, 0,5), такого как ребро от узла 3 до 2 (с весом 0,09)? И вообще, есть ли хорошее место, чтобы узнать гораздо больше о том, как писать код на Python для создания всевозможных DOT-файлов для GraphViz, и увидеть хорошие примеры? Спасибо, Том99

1 ответ

Решение

Graphviz поддерживает цветовой атрибут.

Таким образом, вы можете изменить свой код, чтобы записать строку

3 -> 2 [ label="0.09" color="red" ];

окрасить край как красный.

Простой способ добиться этого - изменить строку

out.write('{} -> {} [ label="{}" ];\n'.format(start,end,weight))

в

if weight < 0.5:
    out.write('{} -> {} [ label="{}" color="red" ];\n'.format(start,end,weight))
else:
    out.write('{} -> {} [ label="{}" ];\n'.format(start,end,weight))
Другие вопросы по тегам