【问题标题】:How to specify the length of an edge in graphviz?如何在graphviz中指定边的长度?
【发布时间】:2021-10-13 14:03:43
【问题描述】:

在有向图中,如果存在循环,则 graphviz 会使该边非常短。

是否有一个参数可以让我改变循环边的长度,这样 图表看起来有点统一。

digraph ER {
  rankdir="LR";
  //orientation=landscape;
    node [shape=ellipse, fontsize=30];
  {node [label="Original"] old;}
  {node [label="Final"] new;}
  {node [label="Intermediate"] ir;}

old -> ir [label="suggest", fontsize=30];
ir -> ir [label="validate", fontsize=30, len=f];
ir -> new [label = "finalize", fontsize=30];
}

【问题讨论】:

    标签: graphviz


    【解决方案1】:

    编辑:对不起,我的回答会使边缘更长,但不是您需要的自引用边缘。

    len 在 dot 中不起作用,但 minlen 可以。

    https://www.graphviz.org/doc/info/attrs.html#d:minlen

    x->y
    [minlen=5]
    

    【讨论】:

      【解决方案2】:

      len 在 dot 中不起作用,但你可以试试这个技巧:

      digraph G {
      rankdir=LR
      a->b[dir=both]
      b->c[dir=both,label="        "]// Just use the space to increase the edge length
      }
      

      如果rankdir=TB,使用label="\n"(根据需要重复\n)来增加长度。

      【讨论】:

      • 如果我希望边缘很短怎么办?喜欢label=" "
      【解决方案3】:

      我发现以下属性“nodesep”可以通过 sfdp 解决这个问题。

      https://www.graphviz.org/doc/info/attrs.html#a:nodesep

      对于dot以外的布局

      nodesep 影响单个节点上循环之间的间距,或一对节点之间的多重边。

      注意这是一个图属性,所以图中所有边的值都是一样的。

      【讨论】:

        【解决方案4】:

        从点(1):

        len=f sets the optimal length of an edge.  The default is 1.0.
        

        【讨论】:

        • 对于dot 必须工作minlen,但在这种情况下它无论如何都不起作用:(
        • 在同一个手册页上,上面一行写着:(neato 和 fdp 特定的属性)。由于fdpneato 专门用于无向 图而不是有向图,因此len 不适用于此处。
        【解决方案5】:

        您可以通过在可见的循环边缘之前添加一堆不可见的循环边缘来使循环边缘更长,如下所示:

        digraph ER {
          rankdir="LR";
          //orientation=landscape;
            node [shape=ellipse, fontsize=30];
          {node [label="Original"] old;}
          {node [label="Final"] new;}
          {node [label="Intermediate"] ir;}
        
        old -> ir [label="suggest", fontsize=30];
        ir -> ir [style="invis"]
        ir -> ir [style="invis"]
        ir -> ir [style="invis"]
        ir -> ir [style="invis"]
        ir -> ir [label="validate", fontsize=30, len=f];
        ir -> new [label = "finalize", fontsize=30];
        }
        

        【讨论】:

          【解决方案6】:

          在.dot 语言中,边缘连接两个不同等级的音符。 边的长度等于(等级差)*ranksep

          默认rankep(在图形属性中)为0.75英寸,因此相邻节点的边缘将为0.75英寸。

          为了减少边长,你在图属性中将ranksep设置为一个较小的值

          【讨论】:

            【解决方案7】:

            我现在使用另一种方法:

            我使用graphviz以点格式输出文件

            dot -T dot -Kneato -o ./positioned.dot ./input.dot
            

            此文件将包含每条边的贝塞尔曲线定义。 我手动更改点以按照我想要的方式绘制曲线。

            一开始这可能看起来有点令人生畏,但一旦你弄清楚它们是如何工作的,这并不难,我正在慢慢寻找一个可以自动为我做这件事的脚本

            然后以您编辑的定位文件作为输入重新运行 dot

            dot -T png -Kneato -O ./positioned.dot
            
            

            通过这种方法,我几乎将点变成了基于文本的 visio 替换

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-07
              • 2018-10-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多