Graphviz dot-file сумасшедшее позиционирование края
У меня проблема с расположением краев в моем точечном файле.
В точечном файле я использовал contrainsts = false, чтобы исключить ребра m и l из ранжирования, и дал ему немного headport и tailport (с pygraphviz: headport='e', tailport='e'
, Они получили сумасшедшую форму. Я хочу, чтобы они были на правой стороне узлов.
Это точечный файл:
strict digraph "" {
graph [bb="0,0,717.03,767.02",
edges="{'arrowsize': '4.0'}",
rankdir=LR,
size="100,100",
];
cen0
[height=0.5,
label=a,
rank=0,
];
3 [
label=b,
rank=1,
];
cen0 -> 3
[label=z,
pos=e];
0
[label=c,
rank=1,
];
cen0 -> 0
[label=z,
pos=e];
cor22
[label=d,
rank=2,
];
3 -> cor22
[label=2,
pos=e];
con23
[label=e,
rank=2,
];
3 -> con23
[label=1,
];
cor2
[label=g,
rank=2,
];
0 -> cor2
[label=4];
con4
[label=h,
rank=2,
];
0 -> con4
[label=3];
1
[label="Why I can't delete the attribute 'width'
from this node?:
Warning: Unable to reclaim box space in spline
routing for edge \"con4\" ->\"con23\". Something is
probably seriously wrong.
",
rank=2,
width=2.5731];
0 -> 1
[label=k];
cor2:e -> cor22:e
[constraint=false,
rank=3
label=l];
con4:e -> con23:e
[constraint=false,
rank=3
label="Why this way?"];
}
Я также удивился, почему появляется это предупреждение, когда я удаляю последний атрибут "width". Как я мог получить свои края в пути, я ожидал?
2 ответа
Вероятно, это автоматически сгенерированный продукт с большим "шумом" - я позволил себе почти полностью переписать код, чтобы мне было легче работать и тестировать, а также сосредоточиться на основных моментах. Вы добавите то, что важно для вас, обратно и выясните, не нарушает ли что-то из этого.
С большим количеством проб и ошибок я нашел четыре основных изменения:
- Четыре узла третьего уровня должны быть в одном ранге (
rank = 3
не помогает) - Они должны быть связаны в желаемом порядке невидимыми краями
- Ребра между этими узлами должны поддерживать правильный уровень иерархии, когда стрелка направлена назад
xlabels
скорее, чемlabels
нужно использовать для краев
Так что вот мой в значительной степени отредактированный код
digraph so
{
rankdir = LR;
// edge[ arrowsize = 4 ]; // you don't want that
cen0[ label = "a" ];
3 [ label = "b" ];
0 [ label = "c" ];
cen0 -> { 3 0 }[ label = "z" ];
cor22[ label = "d" ];
con23[ label = "e" ];
3 -> cor22[ label = "2" ];
3 -> con23[ label = "1" ];
cor2[ label = "g" ];
con4[ label = "h" ];
1 [ label = "Why I can't delete the attribute 'width' from this node?:\nWarning: Unable to reclaim box space in spline routing for edge \"con4\" ->\"con23\".\nSomething is probably seriously wrong.\n--- Width attribute not present here! ---" ];
0 -> cor2[ label = "4"];
0 -> con4[ label = "3" ];
0 -> 1[ label = "k" ];
{rank = same; cor22 con23 cor2 con4 1 }
cor22 -> con23 -> cor2 -> con4[ style = invis ]
cor22:e -> cor2:e[ dir = back, xlabel = " l" ];
con23:e -> con4:e[ dir = back, xlabel = " Is this better?" ];
}
и вот результат: