在GraphViz中制作图例/关键字

Syn*_*ech 62 legend graphviz

我想在GraphViz图表中包含图例或关键字.但是,我无法确定要使用的代码.我也想把它放在一个角落,但我唯一知道的唯一的坐标是左下角:pos="10,10!".

有谁知道我怎么能让这个工作?

Mar*_*cok 50

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]
  }
  ...
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我用过dot.

  • 奇怪; 我得到了[这个](http://i.stack.imgur.com/jztgt.png)和`dot`(其他人更糟). (2认同)
  • 它对我有用,但是我必须添加“ {rank = same; key,key2}”,以强制两端处于同一等级。没有这个,我的箭头看起来很有趣。 (2认同)

mar*_*pet 28

我深信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>
   >];
  }
} 
Run Code Online (Sandbox Code Playgroud)

这就是这个样子:

graphviz输出

Legend 的定位必须像任何其他节点一样(我使用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;
 }
Run Code Online (Sandbox Code Playgroud)

导致:

在此输入图像描述

  • 如果graphviz不是正确的工具,那是什么? (12认同)
  • **>我不知道图例必须由节点组成**好的图例是关于图形,图形由节点和线组成.**>我不认为你想要获得的东西是可能的,即使是花哨的计算.其他工具可能更适合这项任务.**那将是不幸的; 图形实用程序无法提供图形的关键部分,这似乎很奇怪.:( (2认同)
  • 列举为什么你深信不应该这样做是一个有用的附录。 (2认同)

Jon*_*ley 8

在尝试了几种在主 GraphViz 图像中嵌入键的方法后,我决定对我来说,将图例简单地放入它自己的、单独的点文件中、将它渲染为它自己的、单独的图像和然后在我的文档/页面中并排显示图像。

这有几个优点:

  • .dot源代码是简单得多。
  • 很容易更改图例图的 rankdir 以将节点显示在彼此上方或并排显示,以生成位于主图像右侧或下方的键。
  • 不会将排名位置等内容从主图中泄漏到图例中。

例如:

节点图 水平图例

  • 您可以使用 ImageMagick 合并它们:`dot -Tpng graph.gv &gt; graph.png &amp;&amp; dot -Tpng legend.gv &gt; legend.png &amp;&amp; conversion graph.png legend.png -append合并.png` (5认同)

The*_*ell 5

我在以下方面很幸运。我不喜欢它有多宽,但除此之外它还是有效的。

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] ;
}
Run Code Online (Sandbox Code Playgroud)

结果是

结果