как определить граф с графиком без перекрывающихся надписей - PullRequest
0 голосов
/ 04 марта 2020

Следующий файл точек демонстрирует проблему, которую я пытаюсь решить:

digraph G {
    splines=line;
    rankdir=LR;
    A -> B [label="a long label"];
    A -> C [label="a long label"];
    A -> A [label="a very long label"];
    A -> A [label="a very long label"];
    A -> D [label="a long label"];
}

Создает следующий график:

Result Graph

Метки расположены плохо, почти перекрываются.

Что можно сделать, чтобы улучшить внешний вид этого графика?

Я бы определил улучшение , сказав (1) метки не перекрываются друг с другом, (2) метки не перекрывают края и (3) опционально / идеально этикетки нарисованы по краю. № 3 может быть невозможным, но № 1 и № 2 должно быть достаточно. Использование орто-сплайнов всегда обеспечило бы край, на котором метка могла бы быть нарисована и все же читаться нормально, но я знаю, что в настоящее время это не поддерживается в Graphviz.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

По-видимому, в GraphViz нет поддерживаемых решений, которые бы соответствовали требуемым критериям для меток ребер. Моя работа состоит в том, чтобы разделить края между двумя узлами и вставить другой узел, содержащий текст метки края. Новый узел разработан так, чтобы отличать guish от обычных узлов.

Алгоритм компоновки GraphViz хорошо справляется с разделением узлов и не позволяет краям перекрывать узлы.

Обновляя контрольный пример с помощью этого обходного пути, у меня есть следующий файл точек:

digraph G {
    splines=ortho;
    rankdir=LR;

    AA1 [label="a very long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AA2 [label="a very long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AB1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AC1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AD1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 

    A   -> AA1 [arrowhead = "none" ];
    AA1 -> A 
    A   -> AA2 [arrowhead = "none" ];
    AA2 -> A 

    A   -> AB1 [arrowhead = "none" ];
    AB1 -> B

    A   -> AC1 [arrowhead = "none" ];
    AC1 -> C

    A   -> AD1 [arrowhead = "none" ];
    AD1 -> D
}

, который производит это graph

0 голосов
/ 04 марта 2020

«Улучшить» - в поле зрения обозревателя, но для изменения меток используются порты, метки заголовка, пробелы и новые строки.

digraph G {
    splines=line;
    rankdir=LR;
    // use ports to rearrange edges 
    // then headlabel, spaces, and newlines (\n)
    A:n -> A:w [headlabel="a very long label    "];  
    A:s -> A:w [headlabel="a very long label    "];  
    A -> B [label="a long label"];
    A -> C [label="a long label"];
    A -> D [label="\n\na long label"];
}

enter image description here

...