2012-05-03 23 views
27

我試圖使用GraphViz的可視化在點格式如下數據:的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並且沒有邊緣重疊或跨越節點。這是可能的(數學),因爲我自己用biro做了。

+0

嘗試使用'fdp'而不是'neato';它需要更長的時間,但會產生更好的(更多間隔)結果。然而,一些邊緣仍然可能與節點重疊。 – Phrogz

+2

'fdp'更糟。 – Rory

回答

20

我打了那幾個和得到這個:

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 

輸出是這樣的,沒有任何越線:

graph

訣竅是:

  1. 要添加minlen屬性迫使一些分離,讓更多的間距用於再現,而不重疊和交叉。

  2. 反轉一些邊緣的邏輯(使它們在dir = back時不反轉)。這樣,點始終會看到一個非循環圖,並且可以排序邊而不會感到困惑。

  3. 首先關注一些子圖並將它們的節點分組到集羣中,以便在渲染圖的其餘部分時使它們免受干擾。

35

這裏有一個更好的方向的一些步驟:

  • nodesep不是一個節點屬性 - 它可能不會做你所期望的。但它仍然是有用的在你的情況下:

    ...這會影響單個節點上的循環之間的間距,或多個節點之間的多個 。

  • 我不認爲如果你改變它所有邊緣邊緣重量改變一些東西。
  • 啓用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"] 
} 

graphviz output

7

使用點引擎,我得到了下面的輸出,而不改變其應適合於A4點文件。 Marapet的演繹確實更好地利用了這個空間。

dot engine output