【问题标题】:Graphviz outputs a messGraphviz 输出一团糟
【发布时间】:2012-05-13 09:52:52
【问题描述】:

我正在尝试使用 GraphViz 以点格式可视化以下数据:

digraph n {
  node [nodesep=2.0, fontsize=11];
  graph [ overlap=false];
  edge[weight=0.2];
  A -> B [label="I/5"]
  A -> A [label="*/0"]
  A -> C [label="ii/2"]
  A -> H [label="vii/1"]
  B -> D [label="iii/1"]
  B -> E [label="IV/2"]
  B -> F [label="V/2"]
  B -> B [label="vi/2"]
  C -> F [label="V/2"]
  C -> H [label="vii/1"]
  D -> E [label="IV/2"]
  E -> D [label="iii/2"]
  E -> G [label="iv/1"]
  E -> F [label="V/3"]
  F -> B [label="I/4"]
  F -> B [label="vi/1"]
  F -> B [label="*/0"]
  G -> B [label="I/5"]
  H -> B [label="vi/1"]
}

运行以下命令: neato -Tpng Chord_NFA.dot > Chord_NFA.png

给我这个输出:

我希望它适合 A4 并且没有任何边缘重叠或跨越节点。这是可能的(在数学上),因为我自己是用圆珠笔做的。

【问题讨论】:

  • 尝试使用fdp而不是neato;它需要更长的时间,但会产生更好(更多间隔)的结果。但是,有些边可能仍会与节点重叠。

标签: graphviz


【解决方案1】:

以下是朝着更好方向迈出的一些步骤:

  • nodesep 不是节点属性 - 它可能不会达到您的预期。但它在你的情况下仍然有用:

    ...这会影响单个节点或多边上的循环之间的间距 在一对节点之间。

  • 我认为,如果您为 所有 边缘更改边缘 weight 并不会改变什么。
  • 启用splines 通常是个好主意。
  • 可以使用sep 在节点周围添加额外空间
  • overlap 的值多于真/假 - 我经常发现 scalexy 很有用。
  • 一旦节点分布正常,您可以通过使用headlabel/taillabellabeldistancelabelangle 的组合来微调标签位置(以下示例中的红色让它们脱颖而出)。

这是修改后的示例:

digraph n {
splines=true;
sep="+25,25";
overlap=scalexy;
nodesep=0.6;
node [fontsize=11];
//edge[weight=0.2];

A -> B [label="I/5"]
A -> A [label="*/0"]
A -> C [label="ii/2"]
A -> H [label="vii/1"]
B -> D [label="iii/1"]
B -> E [label="IV/2"]
B -> F [headlabel="V/2", labeldistance=4, labelangle=-10, labelfontcolor=red]
B -> B [label="vi/2"]
C -> F [label="V/2"]
C -> H [label="vii/1"]
D -> E [label="IV/2"]
E -> D [label="iii/2"]
E -> G [label="iv/1"]
E -> F [headlabel="V/3", labeldistance=8, labelangle=-7, labelfontcolor=red]
F -> B [label="I/4"]
F -> B [label="vi/1"]
F -> B [label="*/0"]
G -> B [taillabel="I/5", labeldistance=4, labelangle=15, labelfontcolor=red]
H -> B [label="vi/1"]
}

【讨论】:

    【解决方案2】:

    我玩了几下,得到了这个:

    digraph n {
      node [nodesep=2.0, fontsize=11];
      graph [overlap = false];
      subgraph cluster_a {
        style=invisible;
        A; B; H;
      }
      subgraph cluster_b {
        style=invisible;
        D; E; G;
      }
      subgraph cluster_c {
        style=invisible;
        C; F;
      }
      A -> B [label="I/5"];
      A -> A [label="*/0"];
      A -> C [label="ii/2"];
      A -> H [label="vii/1"];
      B:w -> D [label="iii/1"];
      B:nw -> E [minlen=3 label="IV/2"];
      B -> F [minlen=2 label="V/2"];
      B -> B [label="vi/2"];
      C -> F [minlen=2 label="V/2"];
      C -> H [label="vii/1"];
      D -> E [label="IV/2"];
      D -> E [minlen=2 dir=back label="iii/2"];
      G -> E [minlen=2 dir=back label="iv/1"];
      F -> E [dir=back label="V/3"];
      B -> F [minlen=2 dir=back label="I/4"];
      B -> F [minlen=2 dir=back label="vi/1"];
      B -> F [minlen=2 dir=back label="*/0"];
      B -> G [dir=back label="I/5"];
      H -> B [label="vi/1"];
    }
    

    编译:

    dot -Tpng -o Chord_NFA.png Chord_NFA.gv
    

    输出是这样的,没有任何线交叉:

    诀窍是:

    1. 添加 minlen 属性以强制进行一些分离,为渲染提供更大的间距,而不会出现重叠和交叉。

    2. 反转某些边缘的逻辑(使用 dir=back 使它们不反转)。这样,dot 总是看到一个无环图并且可以对边进行排序而不会混淆。

    3. 首先关注一些子图并将它们的节点分组到集群中,以便在渲染图的其余部分时为它们提供一些“保护”,使其免受干扰。

    【讨论】:

      【解决方案3】:

      使用点引擎我得到了以下输出,而没有更改应该适合 A4 的点文件。 Marapet 的演绎确实更好地利用了空间。

      【讨论】:

        猜你喜欢
        • 2021-12-03
        • 2017-04-14
        • 1970-01-01
        • 2016-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        相关资源
        最近更新 更多