Graphic legend / key with nodes

I am trying to create a legend / key in Graphviz that contains not only text, but also nodes and edges. Although I read this post , the HTML table does not seem to work with what I'm trying to do.

Now I am using the following code:

digraph G { fontname="Helvetica"; labelloc=t; rankdir=LR; label="Course Graph"; node[style=filled, fontname="Helvetica", colorscheme=greens3, color=1]; subgraph cluster_key { rank=min; label="Key"; rankdir=LR; kc1[label="Course", peripheries=2, color=2]; k1[shape=plaintext, style=solid, label="Required Course"] prereq[label="Course 1"]; kc2[label="Course 2"]; prereq->kc2; k2[shape=plaintext, style=solid, label="Course 1 is a prerequisite for Course 2"] coreq1[label="Course 1"]; coreq2[label="Course 2"]; coreq1->coreq2[dir=both]; k3[shape=plaintext, style=solid, label="Course 1 and Course 2 are corequisite"] or[style="dashed", color="black", shape="diamond", label="OR"]; or1[label="Course 1"]; or1 -> or[style="dashed", dir="none"]; or2[label="Course 2"]; or2 -> or[style="dashed", dir="none"]; kc3[label="Course 3"] or->kc3; k4[shape=plaintext, style=solid, label="You must take either Course 1 OR\nCourse 2 before taking Course 3"] { rank=min;k1 k2 k3 k4 } } c3[color=3, peripheries=2]; c4[color=3, peripheries=2]; c1->c2[dir=both]; c2->c3; c4_reqs[style="dashed", color="black", shape="diamond", label="OR"]; c4_reqs->c4; c2->c4_reqs[style="dashed", dir="none"]; c5->c4_reqs[style="dashed", dir="none"]; } 

Result of this code:

The result of this code is

but I would like something more like this - preferably a smaller size:

ebut I would like something more like

+7
graphviz directed-graph key legend
source share
1 answer

You're not far off. With some minor adjustments, I got the following result:

enter image description here

The most important change I made is to use rank=source instead of rank=min to properly line up the nodes.

To fix the alignment of the text, I used \r to align the text to the right ( \l does the same, but to the left) and gives all the plaintext nodes the same width.

The whole code looks like this (I added some comments where I made the changes):

 digraph G { fontname="Helvetica"; labelloc=t; rankdir=LR; label="Course Graph"; node[style=filled, fontname="Helvetica", colorscheme=greens3, color=1]; subgraph cluster_key { //rank=min; /* this doesn't really do anything for you */ label="Key"; //rankdir=LR; /* this is also not needed*/ kc1[label="Course", peripheries=2, color=2]; k1[shape=plaintext, style=solid, label="Required Course\r", width=3.5] // Add fixed width so all nodes line up prereq[label="Course 1"]; kc2[label="Course 2"]; prereq->kc2; k2[shape=plaintext, style=solid, label="Course 1 is a prerequisite for Course 2\r", width=3.5] // Add fixed width coreq1[label="Course 1"]; coreq2[label="Course 2"]; coreq1->coreq2[dir=both]; k3[shape=plaintext, style=solid, label="Course 1 and Course 2 are corequisite\r", width=3.5] // Add fixed width or[style="dashed", color="black", shape="diamond", label="OR"]; or1[label="Course 1"]; or1 -> or[style="dashed", dir="none"]; or2[label="Course 2"]; or2 -> or[style="dashed", dir="none"]; kc3[label="Course 3"] or->kc3; k4[shape=plaintext, style=solid, label="You must take either Course 1 OR\rCourse 2 before taking Course 3\r", width=3.5] // Add fixed width { rank=source;k1 k2 k3 k4 } // Use "source in stead of min } c3[color=3, peripheries=2]; c4[color=3, peripheries=2]; c1->c2[dir=both]; c2->c3; c4_reqs[style="dashed", color="black", shape="diamond", label="OR"]; c4_reqs->c4; c2->c4_reqs[style="dashed", dir="none"]; c5->c4_reqs[style="dashed", dir="none"]; } 

On the one hand, the code could have been cleaned up a bit by putting all the plaintext nodes together, so attributes would not have to be declared more often. This would add the advantage of node attributes and ranks that were not divided into different parts of the code:

  { rank=source node [shape=plaintext, style=solid, width=3.5] k1 [label="Required Course\r"] k2 [label="Course 1 is a prerequisite for Course 2\r"] k3 [label="Course 1 and Course 2 are corequisite\r"] k4 [label="You must take either Course 1 OR\rCourse 2 before taking Course 3\r"] } 
+9
source share

All Articles