Graphviz граф позиционирования xlabels
Я пытался использовать xlp и также следовал этому потоку graphviz ( http://www.graphviz.org/content/how-use-xlp-attribute-positioning-external-labels-xlabel), но ни один из них на самом деле не работал.
Это мой точечный код:
digraph {
forcelabels=true;
rankdir=LR;
graph[ranksep=1,nodesep=.5];
node[shape=box];
"start" [xlabel="start",xlp="0,0",shape=doublecircle,label=" "];
"requested"->"fault";
"requested"->"progress";
"start"->"requested";
"progress"->"fault";
"progress"->"progress";
"progress"->"complete";
"fault" [xlabel="fault",shape=doublecircle,label=" "];
"complete" [xlabel="complete",shape=doublecircle,label=" "];
}
И вот как это выглядит:
В идеале, start,fault и complete должны быть расположены непосредственно под узлами, но я не могу правильно позиционировать xlabels.
3 ответа
Если вы используете neato
с -n2
флаг, вы должны быть в состоянии установить положение xlabel
, Вы должны будете указать положение каждого узла.
Так что, если у вас есть файл с именем lb.gv
со следующим содержанием:
digraph{
forcelabels=true;
rankdir=LR;
graph[ranksep=1,nodesep=.5,margin=0.3,bgcolor=Transparent];
node[shape=box];
start [pos="0,0", xlp="23,54", xlabel=start, shape=doublecircle, label= " "];
requested [pos="100,0"];
progress [pos="250,-66"];
fault [pos="400,70", xlp="424,124", xlabel=fault, shape=doublecircle,label= " "];
complete [pos="400,-66", xlp="424,-10", xlabel=complete, shape=doublecircle,label= " "];
requested->fault;
requested->progress;
start->requested;
progress->fault;
progress:w->progress:_;
progress->complete;
}
Вы могли бы бежать neato -n2 -Tpng lb.gv > test.png
Вот что я получил:
- Используйте новые строки в строке метки , чтобы поместить текст ниже узла
- установите fixedsize=true , чтобы сохранить размер узла по умолчанию
- добавить кластер , чтобы самые низкие метки не усекались
digraph {
rankdir=LR;
graph[ranksep=1,nodesep=.5];
// add a cluster to provide "margin" for labels below nodes
subgraph cluster_space {
graph [peripheries=0]
node[shape=box];
// dot ignores xlp
// add newlines to shift label down
// fixedsize=true to keep node sized correctly
"start" [label="\n\n\n\nstart" shape=doublecircle fixedsize=true ];
"requested"
"progress"
"complete" [label="\n\n\n\ncomplete" shape=doublecircle fixedsize=true]
"fault" [label="\n\n\n\nfault" shape=doublecircle fixedsize=true]
"requested"->"fault";
"requested"->"progress";
"start"->"requested";
"progress"->"fault";
"progress"->"progress";
"progress"->"complete";
}
}
Не совсем то, что вы спрашиваете, но вы можете попробовать что-то вроде:
digraph nodes_as_labels {
rankdir=LR;
graph[ranksep=1,nodesep=.5];
node[shape=box];
"start" [xlp="0,0",shape=doublecircle,label=" "];
"fault" [shape=doublecircle,label=" "];
"complete" [shape=doublecircle,label=" "];
"startlabel" [label="start",penwidth="0"];
"faultlabel" [label="fault",penwidth="0"];
"completelabel" [label="complete",penwidth="0"];
"startlabel" -> "start"[style="invis"];
"requested"->"fault";
"requested"->"progress";
"start"->"requested";
"progress"->"fault";
"progress"->"progress";
"progress"->"complete";
"fault" -> "faultlabel"[style="invis"];
"complete" -> "completelabel"[style="invis"];
}
Это приводит к:
Этот подход более актуален, когда вы используете механизм размещения Neato или fdp, потому что тогда вы можете использовать атрибут len для установки расстояния между узлами, которые действуют как метка, и узлами, которые вы маркируете. Таким образом, вы можете предотвратить наложение краев надписей. К сожалению,
len
Атрибут не работает для механизма точечной компоновки, который используется в примере, поэтому метки в результате находятся далеко от узлов, которые они маркируют.