Graphviz arrowhead doesn't work when dir=back - graphviz

I can't figure out how to change the tail of an edge.
No problem with the arrow head, for example this works fine
digraph foo {
x->y [arrowhead=odot]
}
But since I want to change the tail I tried to invert the direction:
digraph foo {
x->y [arrowhead=odot dir=back]
}
This doesn't work, the arrow gets back to the default style.
Also the arrowtail attribute seems not to work, I always get the default style
digraph foo {
x->y [arrowtail=odot]
}

You almost had it - not all combinations of dir, arrowhead and arrowtail are valid.
Here's what works for which dir value:
dir arrowhead arrowtail
-----------------------------
forward x
back x
both x x
none
Therefore, the following should work in your case:
digraph foo {
x->y [arrowtail=odot, dir=back]
}
dir determines which arrows are allowed to be displayed. Which end of the arrow is the head and which end is considered to be the tail doesn't change.

Related

Graphviz for very large state machine

I have a state machine that, despite having very few node (8), has a lot of connections.
How can I draw it using graphviz in a presentable way.
Currently I have this. The problem is that this is not presentable in any way. The arrows have an awkward shape, the states are all over the place...
digraph finite_state_machine {
rankdir="TB";
size="8,5"
{rank = same; 1 2}
{rank = same; 3 4}
{rank = same; 7 8}
1->7[label="<p,a>"];
1->5[label="<p,a>"];
1->3[label="<p,a>"];
1->1[label="<p,a>"];
2->7[label="<~(p),a>"];
2->5[label="<~(p),a>"];
2->3[label="<~(p),a>"];
2->1[label="<~(p),a>"];
3->7[label="<p,a>"];
3->5[label="<p,a>"];
3->3[label="<p,a>"];
3->1[label="<p,a>"];
4->7[label="<~(p),a>"];
4->5[label="<~(p),a>"];
4->3[label="<~(p),a>"];
4->1[label="<~(p),a>"];
5->8[label="<p,a>"];
5->7[label="<p,a>"];
5->6[label="<p,a>"];
5->5[label="<p,a>"];
5->4[label="<p,a>"];
5->2[label="<p,a>"];
6->8[label="<~(p),a>"];
6->7[label="<~(p),a>"];
6->6[label="<~(p),a>"];
6->5[label="<~(p),a>"];
6->4[label="<~(p),a>"];
6->2[label="<~(p),a>"];
7->8[label="<p,a>"];
7->7[label="<p,a>"];
7->6[label="<p,a>"];
7->5[label="<p,a>"];
7->4[label="<p,a>"];
7->2[label="<p,a>"];
8->8[label="<~(p),a>"];
8->7[label="<~(p),a>"];
8->6[label="<~(p),a>"];
8->5[label="<~(p),a>"];
8->4[label="<~(p),a>"];
8->2[label="<~(p),a>"];
}
Which yields this
Is there any way I can make the automata more presentable?
Some times it help setting e.g. minlen=2 on edges, and decorate=1 make it more obvious where labels belong, try adding the following:
edge[decorate=1 minlen=2]
node[width=2 height=2 fontsize=50]
you can have a bit control of arrow tails and heads using compass so you might like the following better:
1:n->1:n
7:s->7:s
8:s->8:s
instead of:
1->1
7->7
8->8
since you only have 2 kind of edge labels It might also help to have a edge color depending on the label
I sugest you try these kind of things out on http://viz-js.com/

Sepetate 2 glutinous arrow header in graphviz

Hi my arrow like following:
https://i.imgur.com/EJNtfc3.png
Arrow on the red marked is glutinous.
How do I divide it?
add code
https://www.codepile.net/pile/XKvOwL3A
In your situation fastest fix would be to add nodesep = 0.15 graph attribute (right after digraph { statement). This attribute adjusts the minimal distance between the nodes in one rank. This results in:
Also you may play with headport and tailport attributes, as I suggested in the comment. Shortcut for them is to add a colon after node when you are defining edge.
If you replace TR_Client_Data -> idle with TR_Client_Data -> idle:e you will get this result:
Edges are crossed, but they are apart.
Also I've noticed that you define node attributes in a wrong way: keyword node defines global attributes for all nodes in the graph (or subgraph). If you want to specify attributes for a single node, place them after node definition.
e.g.
WRONG:
node [
shape = point,
fontsize = 12
] start_point;
CORRECT:
start_point [
shape = point,
fontsize = 12
];

How to underline text as part of a label?

Following is code using dot language.
subgraph cluster1
{
node[style=filled];
color=blue;
b0->b1;
label ="Tada"; // I want this to show as underlined.
}
You can use HTML-like labels and the <u> tag:
digraph cluster1
{
node[style=filled, color=blue];
b0->b1;
label = <<u>Tada</u>>; // I want this to show as underlined.
}
This is the result:
Note that your color=blue statement wasn't applied to any element. I moved it into node.
As pointed out in the comments, this currently only works for svg output. I tried with png and pdf on my Mac running 10.14.6 and they weren't underlined.

How to add edge labels in Graphviz?

I am trying to draw a graph using Graphviz, but I need to add labels on the edges. There does not seem to be any way to that in Graphviz.
Are there a way out?
You use the label property attached to the edge.
digraph G {
a -> b [ label="a to b" ];
b -> c [ label="another label"];
}
The above generates a graph that looks something like this.
#Andrew Walker has given a great answer!
It's also worth being aware of the labeltooltip attribute. This allows an additional string to be attached to the label of an edge. This is easier for a user than the tooltip attribute, as it can be fiddly to hover directly on an edge. The syntax is as follows:
digraph G {
a -> b [label=" a to b" labeltooltip="this is a tooltip"];
b -> c [label=" another label" ];
}
Which gives the following result:
Landed here by googling whether labels could be on arrow's ends, for UML's composition/aggregation. The answer is yes:
"Person" -> "Hand" [headlabel="*", taillabel="1"]
You can use label="\E" It will generate bye default label.
For Example:
digraph G {
a -> b [ label="\E" ];
b -> c [ label="\E"];
}

record nodes and rankdir in graphviz

When I changed the rankdir of my graph from LR to TD, my record nodes also changed their layout direction so they no longer look like a 'record'. I tried applying a separate rankdir to the nodes, but this had no effect.
How does one keep the record nodes with the correct layout?
digraph sample {
graph [rankdir=TD];
node [shape=record];
A [label="ShouldBeTop | ShouldBeBottom"];
B [label="Top | Bottom"];
A -> B;
}
Taking into account that rankdir effectively replaces the notion of "top" and "bottom" for the given graph, that's not surprising.
I am afraid that there is no easy remedy for this, save hacking the source (and that would not be easy at all). You can surround your labels in "{}" with some kind of mass search-replace solution to get the requested effect:
digraph sample { graph [rankdir=TD]; node [shape=record];
A [label="{ShouldBeTop | ShouldBeBottom}"];
B [label="{Top | Bottom}"]; A -> B;
}
You can use html table like labels instead of records. IIRC the table based labels do not rotate with the rank direction. See http://www.graphviz.org/doc/info/shapes.html#html

Resources