35

我正在尝试使用 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 并且没有任何边缘重叠或跨越节点。这是可能的(数学上),因为我自己用圆珠笔做的。

4

3 回答 3

39

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

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

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

  • 如果您为所有边缘更改边缘重量,我认为边缘重量不会改变。
  • 启用样条曲线通常是个好主意。
  • 在节点周围添加额外的空间可以通过sep
  • overlap比真/假有更多的价值——我经常觉得scalexy有用。
  • 一旦节点分布正常,您可以使用/和的组合微调标签位置(下例中的红色以使其突出)。headlabeltaillabellabeldistancelabelangle

这是修改后的示例:

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

图形输出

于 2012-05-03T21:58:31.403 回答
29

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

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

于 2012-07-13T18:54:52.147 回答
8

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

点引擎输出

于 2012-05-23T02:21:12.973 回答