我正在尝试在Graphviz中创建一个图例/键,其中不仅包含文本,还包含节点和边缘。虽然我已阅读this post,但HTML表似乎无法解决我想要做的事情。
现在,我使用的代码是:
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"];
}
此代码的结果是:
但是我想要更像这样的东西 - 最好是更小的尺寸:
答案 0 :(得分:10)
你离我不远。通过一些小的调整,我得到了以下结果:
我所做的最重要的更改是使用rank=source
而不是rank=min
来正确排列节点。
要修复文本对齐方式,我使用\r
将文本右对齐(\l
执行相同但向左移动)并为所有明文节点提供相同的宽度。
整个代码看起来像这样(我添加了一些注释,我做了更改):
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"];
}
另外,通过将所有明文节点放在一起可以清除代码,因此不必更频繁地声明属性。这将使节点和秩属性的额外好处不被分成代码中的不同部分:
{
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"]
}
答案 1 :(得分:0)
以下是构建此图例/键的更小且可能更简单的方法:
此:
digraph G {
graph [fontname="Helvetica" labelloc=t labeljust=c rankdir=LR]
graph [label="Course Graph"]
subgraph clusterAll{
graph [peripheries=0 labelloc=b labeljust=r rankdir=LR]
node[shape=none]
graph[label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD ALIGN="LEFT" >Required Course</TD>
<TD ALIGN="LEFT"><IMG SRC="courseKey1a.png"/></TD></TR>
<TR><TD ALIGN="LEFT" >Course 1 is a prerequisite for Course 2</TD>
<TD ALIGN="LEFT"><IMG SRC="courseKey1b.png"/></TD></TR>
<TR><TD ALIGN="LEFT">Course 1 and Course 2 are corequisite</TD>
<TD ALIGN="LEFT"><IMG SRC="courseKey1c.png"/></TD></TR>
<TR><TD ALIGN="LEFT">You must take either Course 1<BR ALIGN="LEFT"/>OR<BR ALIGN="LEFT"/>Course 2 before taking Course 3</TD>
<TD ALIGN="LEFT"><IMG SRC="courseKey1d.png"/></TD></TR>
</TABLE>
>];
node[shape=oval style=filled, fontname="Helvetica", colorscheme=greens3, color=1];
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"];
lots -> more -> of -> this -> that -> and -> the -> other
}
}