How to create a plot one below the other using dot graphviz? - graphviz

I'm able to create a graph in the same row using dot graphviz. I want to create graphs one below the other i.e. after plotting one subgraph it should go to next line and then start plotting the next graph..

Here is a minimalist code for dot. The subgraph "plot2" is below "plot1" because rankdir=LR.
digraph G {
rankdir=LR
subgraph cluster_2 {
a2
label="plot2"
}
subgraph cluster_1 {
a1
label="plot1";
}
}
You can test it directly here: GraphvizFiddle

Related

Is it possible to specify a cluster inside a subgraph

I would like to create several clusters inside a subgraph like the following :
subgraph sub {
rank=same;
subgraph cluster_test {
p4;
p5;
p6;
}
subgraph cluster_t {
p1;
p2;
p3;
}
}
My aim is to have several clusters (which group the nodes together) at the same rank. However it seems clusters do not work inside subgraphs. Is there a way around that ?
rank=same can't apply across clusters. (yes, it would be nice). Clusters are laid out independently, rank=same would require dependent layout.
Also rank=same really applies to nodes within a subgraph, not a cluster, that can consist of nodes in multiple ranks.
Clusters are positioned based on the ranks of the enclosed nodes, but to try to get multiple clusters horizontally aligned, try embedding then within a parental cluster, like so (or using invisible edges to adjust ranking):
digraph D {
subgraph cluster_outer{
subgraph cluster_test {
p4;
p5;
p6;
}
subgraph cluster_t {
p1;
p2;
p3;
}
graph [peripheries=0] // if you don't want the extra box
}
}
Giving:
[

How to have multiple label one above and one below the edges in graphviz?

I've the following output currently I want to place a label below the edge between p and z in the figure.Is it possible to do in graphviz I've tried using xlabels but it doesn't work.
Current Code:
digraph GPG{
node [shape=box];
subgraph cluster0{
node[shape=circle];
0[label=0,style=invis];
}
subgraph cluster1{
node[shape=circle];
1[label=1,style=invis];
p->z [label="2 | 1",minlen=1];
{
rank = same;
p;z;
}
}
subgraph cluster2{
node[shape=circle];
2[label=2,style=invis];
}
0->1
1->2
}
I want a label below edge p->z as well above the edge.Is it possible in graphviz?
Kind of ugly, but:
digraph overunder{
splines=false
{ rank=same
a -> b [label=" over " ]
a -> b [label="under" penwidth=0.0 dir=none]
}
}
Produces:
You may have to add the non-breaking space characters (see above) because Graphviz seems to position labels based on the length of the text - longer labels are placed above shorter labels.

Graphviz nodes on a timeline

What do I do to ensure April and May fall between Jan and Aug?
Is there a solution without the use of hidden nodes/edges?
digraph G {
rankdir=LR;
"09/30/2021"->"12/03/2021"->"01/05/2022"->"08/19/2022";
"12/03/2021"->"04/27/2022"->"05/25/2022";
}
https://dreampuf.github.io/GraphvizOnline/
Here's how to get your timeline linear using a cluster. Then to get the other arcs not to be inside the cluster, give them nodes outside the cluster. You can always hide these (and fix the one out of Sep) - yes there may be a way to not use hidden nodes, not sure why you'd want to avoid this.
digraph G {
rankdir=LR;
subgraph cluster_0 {
style=filled;
color=lightgrey;
node [style=filled,color=white];
Jan->Feb->Mar -> Apr->May->Jun->Jul->Aug->Sep->Oct->Nov->Dec;
label = "timeline";
}
Sep->op1->Mar->op2->May->op3->Aug;
Mar->op4->Apr->op5->May;
}
Produces this:

Graphviz: How to place nodes only in lower semi-circle using circo layout?

In the attached figure, the nodes are arranged in a circle around the node. Is there a (possibly generic) way to arrange the nodes only in the lower semi-circle, without having to provide fixed coordinates for the nodes?
Edit: Would like to achieve something like shown in the image attached below. As one can see - all the nodes are arranged in the lower semi-circular region (this figure was made using CMap Tools).
The code is trivial, but pasting it anyway.
digraph semicircle {
rankdir="TD"
graph [nodesep="0.1", ranksep="0.3", center=true]
mindist="0.4"
S [label="Root", style="filled", fillcolor="greenyellow", shape="box"]
subgraph cluster1 {
rank="same"
A; B; C; D;
S -> {A, B, C, D};
} }
using dot/circo : graphviz version 2.40.1
I noted that circo placed nodes counter-clockwise, starting at 3 o'clock.
I added enough invisible nodes to fill the 2 through 10 o'clock positions.
To make the inter-nodal distances even more uniform I added:
node [shape=square style=rounded]
The result I got is this:
Try this:
digraph semicircle {
rankdir="TD"
graph [nodesep="0.1", ranksep="0.3", center=true, root=S]
mindist="0.4"
S [label="Root", style="filled", fillcolor="greenyellow", shape="box"]
subgraph cluster1 {
rank="same"
A
z1[style=invis label=""]
z2[style=invis label=""]
B; C; D;
S -> A
S -> z1,z2 [style=invis]
S -> { B, C, D};
}
}

Graphviz: Intersecting but non-recursive clusters

I was wondering if it's possible to do something like this in Graphviz:
As you can see, node "two" is inside two clusters while the clusters aren't recursive.
Note: Image made with Dia.
No, this is currently not possible
Just rewriting Jens' comment as an answer.
While Graphviz won't produce overlapping clusters directly, it will allow you to create overlapping clusters with a bit of editing. (For more info see: https://www.graphviz.org/faq/#FaqDotWithCoords)
Start with:
digraph o {
graph [newrank=true nodesep=.5]
subgraph cluster1 {
graph [margin=50 label="Subgraph 1"]
{rank=same
one-> two [style=invis]
}
}
subgraph cluster2 {
graph [label="Subgraph 2"]
three
}
{rank=same
one two three
}
}
run this command: dot -Tdot myfile.gv >myfile.dot
Then edit myfile.dot to change the boundary box of cluster2. Like so:
digraph o {
graph [bb="0,0,398,175",
newrank=true,
nodesep=.5
];
node [label="\N"];
{
graph [rank=same];
one [height=0.5,
pos="85,76",
width=0.75827];
two [height=0.5,
pos="176,76",
width=0.77632];
three [height=0.5,
pos="340,76",
width=0.99297];
}
subgraph cluster1 {
graph [bb="8,8,254,167",
label="Subgraph 1",
lheight=0.21,
lp="131,155.5",
lwidth=1.17,
margin=50
];
{
graph [rank=same];
one;
two;
one -> two [pos="e,147.67,76 112.37,76 120.74,76 129.1,76 137.46,76",
style=invis];
}
}
subgraph cluster2 {
graph [bb="135,50,390,125", // X1 edited
label="Subgraph 2",
lheight=0.21,
lp="340,113.5",
lwidth=1.17
];
three;
}
}
run this command on the edited file: neato -n2 -Tpng myfile.dot >myfile.png
Giving:

Resources