在GraphViz中制作图例/键

在GraphViz中制作图例/键,graphviz,legend,Graphviz,Legend,我想在我的GraphViz图表中包括图例或键。不过,我很难弄清楚要使用什么代码。我还想把它放在一个角落里,但我唯一能确定的坐标是左下角:pos=“10,10!” 有人知道我如何让它工作吗?我深信graphviz不应该以这种方式使用,但您可以使用来实现您想要的: digraph { Foo -> Bar -> Test; Foo -> Baz -> Test; { rank = sink; Legend [shape=none, margin=0, labe

我想在我的GraphViz图表中包括图例或键。不过,我很难弄清楚要使用什么代码。我还想把它放在一个角落里,但我唯一能确定的坐标是左下角:
pos=“10,10!”


有人知道我如何让它工作吗?

我深信graphviz不应该以这种方式使用,但您可以使用来实现您想要的:

digraph  { 

Foo -> Bar -> Test;
Foo -> Baz -> Test;

{ rank = sink;
    Legend [shape=none, margin=0, label=<
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
     <TR>
      <TD COLSPAN="2"><B>Legend</B></TD>
     </TR>
     <TR>
      <TD>Foo</TD>
      <TD><FONT COLOR="red">Foo</FONT></TD>
     </TR>
     <TR>
      <TD>Bar</TD>
      <TD BGCOLOR="RED"></TD>
     </TR>
     <TR>
      <TD>Baz</TD>
      <TD BGCOLOR="BLUE"></TD>
     </TR>
     <TR>
      <TD>Test</TD>
      <TD><IMG src="so.png" SCALE="False" /></TD>
     </TR>
     <TR>
      <TD>Test</TD>
      <TD CELLPADDING="4">
       <TABLE BORDER="1" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR>
         <TD BGCOLOR="Yellow"></TD>
        </TR>
       </TABLE>
      </TD>
     </TR>
    </TABLE>
   >];
  }
} 
导致:

digraph {
  rankdir=LR
  node [shape=plaintext]
  subgraph cluster_01 { 
    label = "Legend";
    key [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0">
      <tr><td align="right" port="i1">item 1</td></tr>
      <tr><td align="right" port="i2">item 2</td></tr>
      <tr><td align="right" port="i3">item 3</td></tr>
      <tr><td align="right" port="i4">item 4</td></tr>
      </table>>]
    key2 [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0">
      <tr><td port="i1">&nbsp;</td></tr>
      <tr><td port="i2">&nbsp;</td></tr>
      <tr><td port="i3">&nbsp;</td></tr>
      <tr><td port="i4">&nbsp;</td></tr>
      </table>>]
    key:i1:e -> key2:i1:w [style=dashed]
    key:i2:e -> key2:i2:w [color=gray]
    key:i3:e -> key2:i3:w [color=peachpuff3]
    key:i4:e -> key2:i4:w [color=turquoise4, style=dotted]
  }
  ...

有向图{
rankdir=LR
节点[形状=纯文本]
子图簇_01{
label=“图例”;
键[label=]
键2[label=]
键:i1:e->键2:i1:w[样式=虚线]
键:i2:e->键2:i2:w[颜色=灰色]
key:i3:e->key2:i3:w[color=peachpuff3]
键:i4:e->键2:i4:w[颜色=绿松石色4,样式=虚线]
}
...


我使用的是点

如果使用图形[Spline=ortho],则会出现一些问题:线的顺序是相反的

点源:

digraph {
  rankdir=LR
  node [shape=plaintext]
  graph [splines=ortho]
  subgraph cluster_01 { 
    label = "Legend";
    key [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0">
      <tr><td align="right" port="i1">item 1</td></tr>
      <tr><td align="right" port="i2">item 2</td></tr>
      <tr><td align="right" port="i3">item 3</td></tr>
      <tr><td align="right" port="i4">item 4</td></tr>
      <tr><td align="right" port="i5">item 5</td></tr>
      </table>>]
    key2 [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0">
      <tr><td port="i1" bgcolor='greenyellow'>&nbsp;</td></tr>
      <tr><td port="i2">&nbsp;</td></tr>
      <tr><td port="i3">&nbsp;</td></tr>
      <tr><td port="i4">&nbsp;</td></tr>
      <tr><td port="i5">&nbsp;</td></tr>
      </table>>]
    key:i1:e -> key2:i1:w [color=red]
    key:i2:e -> key2:i2:w [color=gray]
    key:i3:e -> key2:i3:w [color=peachpuff3]
    key:i4:e -> key2:i4:w [color=turquoise4, style=dotted]
    key:i5:e -> key2:i5:w [color=red, style=dotted]
  }
}
有向图{
rankdir=LR
节点[形状=纯文本]
图[样条线=正交]
子图簇_01{
label=“图例”;
键[label=]
键2[label=]
键:i1:e->键2:i1:w[颜色=红色]
键:i2:e->键2:i2:w[颜色=灰色]
key:i3:e->key2:i3:w[color=peachpuff3]
键:i4:e->键2:i4:w[颜色=绿松石色4,样式=虚线]
键:i5:e->键2:i5:w[颜色=红色,样式=虚线]
}
}

我在以下方面有点运气。我不喜欢它有多宽,但在其他方面它工作正常

subgraph cluster1 {
    label = "Legend" ;
    shape = rectangle ;
    color = black ;
    a [style=invis] ;
    b [style=invis] ;
    c [style=invis] ;
    d [style=invis] ;
    c -> d [label="only ts", style=dashed, fontsize=20] ; 
    a -> b [label="ts and js", fontsize=20] ;
    gui -> controller [style=invis] ;
    view -> model [style=invis] ;
    builtins -> utilities [style=invis] ;

    gui [style=filled, fillcolor="#ffcccc"] ;
    controller [style=filled, fillcolor="#ccccff"] ;
    view [style=filled, fillcolor="#ccffcc"] ;
    model [style=filled, fillcolor="#ffccff"] ;
    builtins [style=filled, fillcolor="#ffffcc"] ;
    utilities ;
    "external libraries" [shape=rectangle] ;
}
结果是


我也在尝试这样做。我一直在使用子图生成节点类型的键:

digraph G {

    rankdir=RL;
    graph [fontsize=10 fontname="Verdana"];

    node [style=filled height=0.55 fontname="Verdana" fontsize=10];
    subgraph cluster_key {
        label="Key";
        progress [fillcolor="wheat" label="In progress"];
        todo [label="To do"];
        done [fillcolor=palegreen3 label="Done"];
        not_our [fillcolor=none label="Not our\nteam"];
        numbers [color=none label="Numbers\nrepresent\nperson\ndays"];
        progress -> done [style=invis];
        todo -> progress [style=invis];
        not_our -> todo [style=invis];
        numbers -> not_our [style=invis];
    }
    mappings [fillcolor=palegreen3];
    identifiers [fillcolor=palegreen3];
    hyperwarp [fillcolor=wheat];
    ghost [fillcolor=none]
    UI [fillcolor=none]
    events [fillcolor=wheat];
    flag [fillcolor=palegreen3];
    groups [fillcolor=wheat];
    types [fillcolor=wheat];
    instances [];
    resources [];
    optimize [];
    remove_flag [];
    persist [];
    approval [];

    edge [style="" dir=forward fontname="Verdana" fontsize=10];
    types -> flag;
    groups -> events;
    events -> {flag mappings identifiers};
    ghost -> hyperwarp;
    UI -> ghost;
    resources -> identifiers;
    optimize -> groups;
    hyperwarp -> flag;
    instances -> {ghost UI types events hyperwarp flag};
    resources -> {groups flag};
    remove_flag -> approval;
    persist -> approval;
    approval -> {types resources instances};
}
导致


但是经过思考,看到我必须将图例放置在主图表旁边的困难,主图表中节点排名的位置影响图例中节点排名的方式,以及这引入的源代码的复杂性,我尝试了另一种方法(参见我的另一个答案,使用单独的图表作为键)

在尝试了几种在主GraphViz图像中嵌入密钥的方法后,我决定,对我来说,更合理的做法是将图例放入自己的单独点文件中,将其呈现为自己的单独图像,然后在文档/页面中并排显示图像

这有几个优点:

  • .dot
    源代码要简单得多
  • 更改图例图的rankdir可以很容易地将节点显示在彼此的上方,或并排显示,以生成一个位于主图像右侧或其下方的关键点
  • 没有泄漏的东西,如排名位置从主图表到传奇
例如:


就布局而言,这看起来不错,但它需要手动输入表中的每个项目,而不是使用现有的节点对象。我尝试使用子图和集群,但两者都不足以可靠地控制表的布局(我知道引擎负责决定普通图形的最佳布局,但表格很容易进行最佳布局,不需要复杂的计算;矩形足够简单)。我不知道图例必须由节点组成-我用一个示例更新了响应,但没有成功,至少如果你需要网格线的话。我不认为你想要得到的是可能的,即使是通过奇特的计算。其他工具可能更适合该任务。>我不知道图例必须由节点组成图例是关于图形的,图形是由节点和线组成的。>我不认为您希望获得的是可能的,即使是通过奇特的计算。其他工具可能更适合该任务。这将是不幸的;奇怪的是,图形工具不能提供gr的关键部分(这将是一个有用的附录来列举为什么你深信这不应该做。奇怪的是,我得到了
dot
(其他人更糟)。@Synetech,我使用的是GraphViz 2.28(如果有关系的话)。在您的图表中出现
key2
似乎有些奇怪。可能是这样;我正在使用2.26.3。我将尝试最新版本。@Synetech,仅供参考,我在运行2.26.3的Windows7 PC上尝试了此功能,并重现了
key2
问题。我更新了该PC(版本为2.30.1),现在它可以工作了。它对我有效,但我必须添加“{rank=same;key,key2}“强制两端位于同一列上。没有这个,我就有了看起来很滑稽的箭头。在子图之前使用
spline=true;
取消
spline=ortho;
digraph G {

    rankdir=RL;
    graph [fontsize=10 fontname="Verdana"];

    node [style=filled height=0.55 fontname="Verdana" fontsize=10];
    subgraph cluster_key {
        label="Key";
        progress [fillcolor="wheat" label="In progress"];
        todo [label="To do"];
        done [fillcolor=palegreen3 label="Done"];
        not_our [fillcolor=none label="Not our\nteam"];
        numbers [color=none label="Numbers\nrepresent\nperson\ndays"];
        progress -> done [style=invis];
        todo -> progress [style=invis];
        not_our -> todo [style=invis];
        numbers -> not_our [style=invis];
    }
    mappings [fillcolor=palegreen3];
    identifiers [fillcolor=palegreen3];
    hyperwarp [fillcolor=wheat];
    ghost [fillcolor=none]
    UI [fillcolor=none]
    events [fillcolor=wheat];
    flag [fillcolor=palegreen3];
    groups [fillcolor=wheat];
    types [fillcolor=wheat];
    instances [];
    resources [];
    optimize [];
    remove_flag [];
    persist [];
    approval [];

    edge [style="" dir=forward fontname="Verdana" fontsize=10];
    types -> flag;
    groups -> events;
    events -> {flag mappings identifiers};
    ghost -> hyperwarp;
    UI -> ghost;
    resources -> identifiers;
    optimize -> groups;
    hyperwarp -> flag;
    instances -> {ghost UI types events hyperwarp flag};
    resources -> {groups flag};
    remove_flag -> approval;
    persist -> approval;
    approval -> {types resources instances};
}
subgraph cluster_01 {
    label = "Legend";
    node [shape=point]
    {
        rank=same
        d0 [style = invis];
        d1 [style = invis];
        p0 [style = invis];
        p1 [style = invis];
        s0 [style = invis];
        s1 [style = invis];
    }
    d0 -> d1 [label=deprecated style=dashed]
    p0 -> p1 [label=proposed style=dotted]
    s0 -> s1 [label=stable]
}