在GraphViz中创建图例/键


76

我想在我的GraphViz图中包含图例或键。不过,我在弄清楚要使用什么代码时遇到了麻烦。我也想把它放在一个角落,但是我唯一确定的坐标是左下角:pos="10,10!"

有谁知道我该怎么做?

Answers:


54
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]
  }
  ...

在此处输入图片说明

我用过dot


2
奇怪; 我得到这个dot(他人更差)。
Synetech

@Synetech,我正在使用GraphViz 2.28(如果重要的话)。key2在您的图形中显示似乎很奇怪。
Mark Rajcok

它可能; 我正在使用2.26.3。我将尝试最新版本。
Synetech

@Synetech,仅供参考,我在运行2.26.3的Windows7 PC上尝试了此操作,并重现了该key2问题。我更新了该PC(版本为2.30.1),现在可以使用了。
Mark Rajcok

2
它对我有用,但是我必须添加“ {rank = same; key,key2}”,以强制两端处于同一等级。没有这个,我的箭头看起来很有趣。
奥利维尔·布德里

29

我深信不应以这种方式使用graphviz,但是您可以使用HTML标签来实现所需的功能:

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

这是这样的:

graphviz输出

必须像其他任何节点一样完成图例的定位(我使用rank = sink使其到达底部)-您可以使用其margin属性来微调位置。

编辑

不使用标签,这可能是前进的方向-我不确定是否要完全消除ranksep

digraph  { 
 mindist=0;
 ranksep=0;
 nodesep=0;

 node[shape=box,margin="0,0",width=1, height=0.5];
 edge [style=invis];

 Legend[width=2];
 Legend -> Foo;
 Legend -> FooValue;
 Foo -> Bar;
 FooValue -> BarValue
 Bar -> Baz;
 BarValue -> BazValue;

 edge [constraint=false];
 Foo -> FooValue;
 Bar -> BarValue
 Baz -> BazValue;
 }

导致:

在此处输入图片说明


就布局而言,这看起来不错,但与使用现有节点对象不同,它需要手动在表中输入每个项目。我的尝试尝试了子图和聚类,但都不够可靠,无法控制表格的布局(我知道引擎负责确定普通图的最佳布局,但是表格易于优化布局,没有花哨的计算应该是必需的;矩形足够简单)。
Synetech

1
我不知道图例必须由节点组成-我用一个向该方向发展的示例更新了响应,但没有成功,至少在您需要网格线的情况下。我认为即使花哨的计算,您也不希望获得什么。其他工具可能更适合该任务。
marapet 2011年

2
>我不知道图例必须由节点组成。图例是关于图的,而图是由节点和线组成的。>我认为,即使进行了花哨的计算,您也不希望获得什么。其他工具可能更适合该任务。那将是不幸的。图形实用程序无法提供图形的关键部分似乎很奇怪。:(
Synetech 2011年

1
这将是一个有用的附录,以枚举为什么您深信不应该这样做。
达沃斯

4

我在以下方面很幸运。我不喜欢它有多宽,但否则行得通。

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

结果是

结果


2

如果使用图表,则会出现一些问题[splines=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]
  }
}

2

在尝试了几种在主graphviz图像中嵌入键的方法之后,我决定对我而言,将图例简单地放入其自己的单独的点文件中,将其呈现为单独的单独的图像和然后在我的文档/页面中并排显示图像。

这有一些优点:

a)的 .dot源代码实质上更简单。b)更改图例图的rankdir以在彼此上方或并排显示节点以生成位于主图像右侧或主图像下方的键非常容易。c)诸如排名位置之类的内容不会从主图中泄漏到图例中。

例如:

节点图 水平图例


1

我正在尝试做同样的事情。我一直在使用子图来制作节点类型的键:

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

导致

带有图例的节点类型图

但是在反思时,看到了我必须将图例与主图并排放置的困难,主图中节点排名的位置如何影响图例中的图例,以及由此引入的源代码的复杂性,我试图尝试其他方法(请参阅我的其他答案,使用单独的图形作为键)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.