#python-3.x #graphviz
#python-3.x #graphviz
Вопрос:
У меня есть приведенный ниже файл .gv, который отображает график как ожидалось, но я также пытаюсь получить, сколько связанных ребер (разных путей к дереву) находится в файле
digraph G {
300 -> 100 [label="3"]
400 -> 100 [label="4"]
500 -> 400 [label="5"]
}
Редактировать:
Добавлено больше узлов дерева
digraph G {
300 -> 100 [label="3"]
400 -> 100 [label="4"]
500 -> 400 [label="5"]
600 -> 500 [label="6"]
700 -> 100 [label="1"]
800 -> 700 [label="2"]
900 -> 800 [label="3"]
1000 -> 100 [label="1"]
2000 -> 1000 [label="2"]
3000 -> 2000 [label="3"]
4000 -> 2000 [label="4"]
5000 -> 4000 [label="5"]
5000 -> 3000 [label="6"]
}
Ожидается, что нижеприведенные списки будут созданы из дерева выше
[300 , 100]
[600 , 500 , 400 , 100]
[900 , 800 , 700 , 100]
[5000 , 4000 , 3000 , 2000 , 1000 , 100]
Есть ли способ, которым graphviz может предоставить эту информацию или любой другой модуль python, который может помочь с этим?
Комментарии:
1. Какого результата (количества) вы ожидали бы, если бы у графика была только одна (терминальная) головка и только один (терминальный) хвост, но в середине было много ветвей (т. Е. все ветви были объединены)?
2. У меня не было бы такого сценария, но если есть несколько средних ветвей, то объедините их все в один список. поскольку все средние ветви ведут к одной голове, в этом случае ветвь началась самостоятельно (300 -> 100), поэтому я пытаюсь найти такие сценарии.
3. Не могли бы вы прикрепить более крупный, более реалистичный пример. Я думаю, у меня есть ваш ответ, но для тестирования нужен график большего размера.
4. Я добавил больше реалистичных узлов дерева, пожалуйста, поделитесь любым решением, которое у вас может быть.
5. Пожалуйста, добавьте полный список путей, которые вы ожидаете от вашего примера, чтобы людям было легче понять, что вы имеете в виду.
Ответ №1:
Это делается не с помощью Python, а только с помощью программ Graphviz и сценария оболочки. Также выходные данные необходимо будет переформатировать, но я предполагаю, что вы можете это сделать.
- однострочная программа gvpr (gvpr — это программа Graphviz) для перечисления каждого узла с степенью ==0 (без входных ребер).
- для каждого такого узла используйте программу cliptree gvpr, которая поставляется (обычно) с пакетом Graphviz (посмотрите в /usr/share/graphviz/gvpr)
Здесь:
gvpr 'N[indegree==0]{print ($.name)}' subTree1.gv | while read N; do gvpr -a $N -f $DIR/cliptree subTree1.gv;done
Вывод:
digraph gvpr_result {
300;
100;
}
digraph gvpr_result {
100;
400;
500;
600;
}
digraph gvpr_result {
100;
700;
800;
900;
}
digraph gvpr_result {
100;
1000;
2000;
3000;
4000;
5000;
}
Комментарии:
1. Я пытался запустить эту команду из кода python, используя подпроцесс, и увидел ошибку, хотя она не распознается как внутренняя или внешняя команда. Работает ли эта команда как в Linux, так и в Windows?
2. Я могу протестировать это в ОС Linux, но это не сработало в Windows. Я не мог найти cliptree, когда загружал graphviz для Windows.