Как 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))