Graphviz图例/带节点的键

时间:2013-10-21 19:01:02

标签: key graphviz legend directed-graph

我正在尝试在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"];

}

此代码的结果是:

The result of this code is

但是我想要更像这样的东西 - 最好是更小的尺寸:

ebut I would like something more like

2 个答案:

答案 0 :(得分:10)

你离我不远。通过一些小的调整,我得到了以下结果:

enter image description here

我所做的最重要的更改是使用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)

以下是构建此图例/键的更小且可能更简单的方法:

  1. 将整个图例放入 html表中,并使其成为集群标签
  2. 使用 labelloc labeljust 放置标签/图例/表格
  3. 将每个左侧图形转换为独立图像,然后将其包含在 IMG 属性

此:

 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
  }
}

产生了这个: enter image description here

相关问题