How to add edge labels in Graphviz? - 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"];
}

Related

Can I get graphviz to draw a flowchart-terminal shape?

In flowcharts, one of the "standard" node shapes is that of a terminal:
But this shape does not seem to be directly supported by Graphviz, according to the documentation here. This seems a bit strange to me...
Is there some way to get graphviz to draw this shape, that I'm missing?
Try shape=Mrecord, like so:
digraph D {
A [shape=Mrecord label="Tip Top"];
A -> B
}
Giving:
You can use "rounded style" on your node shapes, e.g.:
digraph G {
node [style="rounded", shape=box]; a;
node [style="" shape=box]; b;
a -> b;
}
produces this:

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/

how can I adjust direction of edge in dot diagram?

Before asking, I tried to search the answer for my question, buf I couldn't find.
My question is about changing edge direction in dot diagram. Rankdir is 'LR', but in certain part of graph, I want to use 'TB'. Let me give an example.
digraph G {
rankdir=LR;
size="7,5";
browser->ui_thread;
browser->db_thread;
browser->webkit_thread;
browser->cache_thread;
browser->file_thread;
browser->io_thread;
io_thread[style=filled];
cache_thread[style=filled];
ui_thread->thread[label=inherit];
ui_thread->messageloop[style=dotted];
db_thread->messageloop[style=dotted];
webkit_thread->messageloop[style=dotted];
cache_thread->messageloop[style=dotted];
file_thread->messageloop[style=dotted];
io_thread->messageloop[style=dotted];
}
it gives out graph like this
But, this is not what I want.
I want the following image. "thread" is above "ui_thread" vertically.
You may think it can be solved easily using "rankdir=same" with "thread" and "ui_thread".
I sure tried this already. but I failed. "thread" is always below "ui_thread".
thanks,
Unfortunately, graph direction can only be specified once, and the whole graph stays in that direction. In this situation, you can usually get the desired effect with a combination of constraint=false and invisible edges to force some ordering.
This code will produce your second image:
digraph G {
rankdir=LR;
size="7,5";
browser->thread[style=invis];
browser->ui_thread;
browser->db_thread;
browser->webkit_thread;
browser->cache_thread;
browser->file_thread;
browser->io_thread;
io_thread[style=filled];
cache_thread[style=filled];
ui_thread->thread[label=inherit constraint=false];
ui_thread->messageloop[style=dotted];
db_thread->messageloop[style=dotted];
webkit_thread->messageloop[style=dotted];
cache_thread->messageloop[style=dotted];
file_thread->messageloop[style=dotted];
io_thread->messageloop[style=dotted];
}

Graphviz (DOT) Captions

I need to print a large number of graphs using Graphviz DOT. To distinguish which input each graph corresponds to, I want to also have a caption for each graph. Is there anyway to embed this into the DOT representation of the graphs.
You can use label to add a caption to the graph.
Example:
digraph {
A -> B;
label="Graph";
labelloc=top;
labeljust=left;
}
labelloc and labeljust can be used to determine top/bottom and left/right position of the graph label.
All the details and other attributes that can be used to modify the label (font etc) in the graphviz attribute reference.
Tip: Define the graph label end of your dot file, otherwise subgraphs will inherit those properties.
Graph's can have attributes just like nodes and edges do:
digraph {
graph [label="The Tale of Two Cities", labelloc=t, fontsize=30];
node [color=blue];
rankdir = LR;
London -> Paris;
Paris -> London;
}
That dot file produces this graph.
If you are looking for a way to add a caption to a Graph object of graphviz in python. Then the following code can help:
from graphviz import Graph
dot = Graph()
dot.node('1','1')
dot.node('2','2')
dot.edge('1','2', label="link")
dot.attr(label="My caption")
dot.attr(fontsize='25')
dot.render(view=True)
Output:

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