【问题标题】:Making a Legend/Key in GraphViz在 GraphViz 中制作图例/键
【发布时间】:2011-03-30 18:26:33
【问题描述】:

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

有人知道我怎样才能让它工作吗?

【问题讨论】:

    标签: graphviz legend


    【解决方案1】:

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

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

    这就是它的样子:

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

    导致:

    【讨论】:

    • 这在布局方面看起来不错,但它需要手动输入表格中的每个项目,而不是使用现有的节点对象。我的尝试尝试了子图和集群,但都不足以控制表格的布局(我知道引擎负责决定普通图的最佳布局,但表格很容易优化布局,没有花哨的计算应该是必需的;一个矩形就足够简单了)。
    • 我不知道图例必须由节点组成 - 我用一个进入该方向的示例更新了响应,但没有成功,至少如果您需要网格线。我不认为你想得到的东西是可能的,即使有花哨的计算。其他工具可能更适合该任务。
    • > 我不知道图例必须由节点组成 那么图例是关于图形的,而图形是由节点和线组成的。 > 我不认为你想得到的东西是可能的,即使是花哨的计算。其他工具可能更适合该任务。 那将是不幸的;图形实用程序不能提供图形的关键部分似乎很奇怪。 :(
    • 这将是一个有用的附录,可以列举您为什么深信不应该这样做。
    【解决方案2】:
    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

    【讨论】:

    • 奇怪;我得到了thisdot(其他人更糟)。
    • @Synetech,我正在使用 GraphViz 2.28(如果重要的话)。 key2 出现在您的图表中似乎很奇怪。
    • 可能;我正在使用 2.26.3。我会尝试最新版本。
    • @Synetech,仅供参考,我在运行 2.26.3 的 Windows7 PC 上进行了尝试,并重现了key2 问题。我更新了那台电脑(到版本 2.30.1),现在它可以工作了。
    • 它对我有用,但我必须添加 "{rank=same; key, key2 }" 以强制两端处于同一等级。没有这个,我的箭头看起来很有趣。
    【解决方案3】:

    如果使用图形[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]
      }
    }
    

    【讨论】:

    • 在子图前使用splines = true;取消splines = ortho;
    【解决方案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] ;
    }
    

    结果是

    【讨论】:

      【解决方案5】:

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

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

      导致

      但经过反思,看到我不得不将图例放置在主图旁边的困难,主图中节点排名的位置影响图例中的那些的方式,以及这引入的源中的复杂性,我很想尝试不同的方法(请参阅我的其他答案,使用单独的图表作为键)

      【讨论】:

        【解决方案6】:

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

        这有几个优点:

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

        例如:

        【讨论】:

        • 您可以使用 ImageMagick 合并它们:dot -Tpng graph.gv &gt; graph.png &amp;&amp; dot -Tpng legend.gv &gt; legend.png &amp;&amp; convert graph.png legend.png -append combined.png
        【解决方案7】:
        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]
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多