Как структурировать несколько подграфов в Graphviz? - PullRequest
0 голосов
/ 01 апреля 2019

Моя конечная цель - написать скрипт на python, который будет автоматически генерировать графы графиков на основе некоторых входных данных.Тем не менее, я сначала сосредотачиваюсь только на графике.

Это то, что у меня сейчас есть:

digraph G {
compound=true;
node [shape=box];
edge [dir=none];

subgraph cluster_overall{
        subgraph cluster_top{
        apple;
        banana;
        }
        subgraph clustermsc{
        basket1;
        basket2;
        label="Baskets";
        }
        subgraph cluster_bottom{
        orange;
        kiwi;
        }
label="Test";
}       
apple -> basket1;
banana -> basket2;
orange -> basket1;
kiwi -> basket2;
}

Текущий: https://i.imgur.com/76GCx0f.png

Это то, что я хочумой последний график, чтобы выглядеть.С количеством фруктов, равномерно распределенных между верхней и нижней секцией (на основе даты ввода):

Финал: https://i.imgur.com/OHFsAdd.png

Как мне структурировать страницу, чтобы иметь 3 статических, отдельныхразделы.В настоящее время расположение фруктов постоянно меняется в зависимости от узла, на который они указывают.

Пожалуйста, дайте мне знать, если мне неясно в моем объяснении, я постараюсь объяснить его лучше.Благодарю.Не хватает репутации для прямой публикации изображений.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

В graphviz важно создать иерархию в том виде, в каком ее видит инструмент, а не воспроизводить логику, которая у вас на уме. простое изменение краев от корзин к «нижним» фруктам делает работу:

digraph G {
compound=true;
node [shape=box];
edge [dir=none];

subgraph cluster_overall{
        subgraph cluster_top{
        apple;
        banana;
        }
        subgraph clustermsc{
        basket1;
        basket2;
        label="Baskets";
        }
        subgraph cluster_bottom{
        orange;
        kiwi;
        }
label="Test";
}       
apple -> basket1;
banana -> basket2;
basket1 -> orange;  // !!!
basket2-> kiwi;     // !!!
}

дает вам

enter image description here

Если вы хотите навязать определенный порядок предметов (например, яблоко находится слева от банана), вы можете сделать это, заменив определение на

subgraph cluster_top{
    { rank = same; apple -> banana[ style = invis ] }
    }
0 голосов
/ 01 апреля 2019

Если я правильно вас понял, вам нужно соединить кластеры с невидимыми краями, чтобы заставить их положение.

Здесь я добавил фиктивный узел в каждый кластер (потому что для соединения кластеров вы должны соединить узлы вэти кластеры, а затем добавьте атрибуты lhead и ltail ).

Затем я связал эти кластеры в правильном порядке с невидимыми краями.Также я добавил чрезвычайно большой вес к этим краям, чтобы дать им приоритет над другими краями.

Это то, что вам нужно?

digraph G {
    compound=true;
    node [shape=box];
    edge [dir=none];

    subgraph cluster_overall{
            subgraph cluster_top{
            dummy_top [shape=point width=0 style=invis]
            apple;
            banana;
            }
            subgraph clustermsc{
            dummy_msc [shape=point width=0 style=invis]
            basket1;
            basket2;
            label="Baskets";
            }
            subgraph cluster_bottom{
            dummy_bottom [shape=point width=0 style=invis]
            orange;
            kiwi;
            }
    label="Test";
    }
    dummy_top -> dummy_msc [
        style=invis
        weight=100
        lhead="clustermsc"
        ltail="cluster_top"
    ]
    dummy_msc -> dummy_bottom [
        style=invis
        weight=100
        lhead="cluster_bottom"
        ltail="clustermsc"
    ]
    apple -> basket1;
    banana -> basket2;
    orange -> basket1;
    kiwi -> basket2;

}

...