2013-05-27 65 views
8

我有一個隨時間變化的圖形(通常是添加新節點)。我需要多次重新生成圖表,並且希望所有節點都保持在原來的位置。將graphviz與fdp算法一起使用,設置pin -flag並使用pos參數指定位置時,這部分工作。強制graphviz保存節點位置

在大多數情況下,這項工作非常好。但是特別是當添加新節點時,佈局有時會發生巨大變化 - 這是我需要避免的。有沒有一個選項,實際上這些固定位置?這可能會導致一個醜陋的圖表,這將是好的 - 但他們只需要堅持。

回答

14

的Graphviz不會使它容易保持化整爲零在相同的位置:

  • 添加/刪除節點可能會導致完全不同的佈局。
  • 添加/刪除節點可以更改邊界框的尺寸以進行更改。

如果在創建圖形時所有節點都知道以下工作:

  • 創建一個包含所有可能節點的圖,讓graphviz的攤開來。您可以在圖表的開頭添加nodes[pin=true];(以後您不必再添加它)。
  • 佈局圖:

    fdp -Tdot input.gv -o input.pos.gv 
    

    您現在有一個包含所有節點一個點文件。您可以將此用作要創建的所有圖形的基本文件:

  • 對於每個圖,創建一個input.pos.gv的副本,並通過將style=invis添加到其屬性中來隱藏不需要的節點和邊。這確保它們不被顯示,但是它們在佈局中使用的位置將不會被剪掉(例如,如果在圖的最上方)。
  • 佈置它們使用這樣的事情(neato和期權-n2是重要組成部分):

    neato -n2 -Tpng input.pos.v1.gv -o output.v1.png 
    

例子:

input.gv:

digraph g{ 
    node[pin=true]; 
    a -> b; 
    a -> c; 
    b -> d; 
    b -> e; 
    b -> f; 
    c -> g; 
} 

input.pos.modified.gv:

digraph g { 
    node [label="\N", pin=true]; 
    graph [bb="0,0,187,207"]; 
    a [pos="60.846,70.555", width="0.75", height="0.5", style=invis]; 
    b [pos="94.351,128.04", width="0.75", height="0.5"]; 
    c [pos="76.868,18.459", width="0.75", height="0.5"]; 
    d [pos="119.08,188.8", width="0.75", height="0.5",style=invis]; 
    e [pos="157.97,106.75", width="0.75", height="0.5"]; 
    f [pos="27.319,158.05", width="0.75", height="0.5"]; 
    g [pos="160.1,20.585", width="0.75", height="0.5"]; 
    a -> b [pos="e,84.434,111.03 70.717,87.493 73.42,92.13 76.411,97.263 79.332,102.27", style=invis]; 
    a -> c [pos="e,71.34,36.433 66.27,52.918 66.934,50.759 67.624,48.514 68.32,46.252", style=invis]; 
    b -> d [pos="e,111.86,171.05 101.5,145.62 103.54,150.61 105.8,156.17 108.01,161.59", style=invis]; 
    b -> e [pos="e,133.72,114.86 118.76,119.87 120.45,119.31 122.17,118.73 123.89,118.16"]; 
    b -> f [pos="e,49.99,147.9 71.657,138.2 67.726,139.96 63.572,141.82 59.447,143.67"]; 
    c -> g [pos="e,133.07,19.895 104.12,19.155 110.07,19.307 116.47,19.471 122.74,19.631"]; 
} 

輸入。PNG無需修改:

output.png

隱藏節點:

output with invisible nodes

+0

非常感謝您的回答!不幸的是,我一開始並不知道所有節點。一些背景信息:我正在形象化一個物理網絡,它可以隨時改變(新的,以前未知的節點被添加,連接改變,...)。而且由於最終用戶可以移動節點並創建自己的佈局,所以一旦執行更新,它就不應該完全改變。所以這不能用graphviz來完成?如果沒有,是否有其他選擇?我一直在尋找年齡...... – Remo

+0

我也在考慮創建子圖或創建單獨的圖並將它們組合在一起。這可能嗎?我沒有要求新節點很好地適應......它們可以放置在所有現有節點之外,並且連接可以重疊,如果需要的話。 – Remo

+0

使用'pin'和'pos',您可以嘗試爲新節點添加默認(或隨機)的'pos'值。我想我記得在某個地方看過,爲了擁有固定的節點位置,所有的節點都必須有'pos'屬性(不知道邊緣)。 – marapet