'Graphviz graph positioning xlabels
I have tried using xlp and also followed this graphviz thread (http://www.graphviz.org/content/how-use-xlp-attribute-positioning-external-labels-xlabel), but neither have actually worked.
This is my dot code:
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=" "];
}
And this is what it looks like:
Ideally start,fault, and complete would just be directly under the nodes, but I can't seem to postion the xlabels correctly.
Solution 1:[1]
If you use neato
with the -n2
flag, you should be able to set the position of xlabel
. You would need to specify the position of every node, though.
So if you had a file called lb.gv
with the following contents:
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;
}
You could run neato -n2 -Tpng lb.gv > test.png
That's what I got:
Solution 2:[2]
Not exactly what you are asking, but you could try something like:
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"];
}
This results in:
This approach is more relevant when you are using the neato or fdp layout engine, because then you can use the len attribute to set the distance between the nodes that act as label and the nodes you are labeling. This way you can prevent the labels from overlapping edges. Unfortunately, the len
attribute does not work for the dot layout engine that the example is using, which is why the labels in the result are far away from the nodes they are labeling.
Solution 3:[3]
- Use newlines in label string to drop text below node
- set fixedsize=true to keep node size to default
- add cluster to keep lowest labels from being truncated
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";
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | toongeorges |
Solution 3 | sroush |