我正在使用graphviz(點)來生成您可以在下面看到的圖形。左下角的節點(紅色橢圓)會導致煩惱,因爲其邊緣會跨越相鄰節點的多個邊緣。有沒有辦法限制節點放置到某個區域?如何控制graphviz中的節點位置(即避免邊緣交叉)
感謝您的想法
graph with edge crossing several other edges http://i39.tinypic.com/e6od8z.png
我正在使用graphviz(點)來生成您可以在下面看到的圖形。左下角的節點(紅色橢圓)會導致煩惱,因爲其邊緣會跨越相鄰節點的多個邊緣。有沒有辦法限制節點放置到某個區域?如何控制graphviz中的節點位置(即避免邊緣交叉)
感謝您的想法
graph with edge crossing several other edges http://i39.tinypic.com/e6od8z.png
我不知道,通過這些來控制單個節點的位置的任何手段。它沒有任何意義,因爲爲了做到這一點,您需要知道最終圖的樣子,但手動放置一個節點會改變圖的其餘部分的渲染方式。
我通過更改在.dot
文件中定義我的節點的順序,並在圖層級調整nodesep
和ranksep
屬性來解決此問題。這是一個細化的過程 - 每次調整一些東西,直到看起來正確。
您也可以將圖形呈現爲SVG
,然後將其導入到Visio(或其他編輯器)中,然後手動重新排列您不滿意的節點。
@Jannis,如果你想繼續在回答這個,有是實際控制單個節點放置的方式 - 使用「POS」屬性:
http://www.graphviz.org/doc/info/attrs.html#d:pos
作爲這樣的一個例子,你可以寫:
n [pos="3,5!"];
這將迫使節點n
是在精確(3,5)
。
但是,這隻適用於佈局引擎「fdp」和「neato」。
'pin'屬性(!),是「fdp,neato only」(它不適用於點)。因此,除非你繞過點佈局引擎,否則使用'pos'對於點來說沒有意義。 – nobar 2011-03-03 20:24:17
@nobar:嗯,再次看着文檔看起來你是對的 - 我的壞,對不起。 – 2011-03-05 16:24:48
我注意到了!也不適用於fdp,雖然它適用於neato。此外,應該管理「pos」屬性中給定座標的縮放的-s參數(默認值爲72.0)似乎不起作用(導致段錯誤)。總之:將所有'pos'屬性的數字除以72.0,並使用'neato'作品! – 2014-11-20 09:10:30
您可以創建一個不可見約束,以使紅色節點出現在所有其他節點的左側。
redNode -> leftmostNode [style=invis];
前:
後:
這解決了我的問題。我只是想讓別的東西出現在另一邊。謝謝。 – 2011-11-06 08:49:36
我喜歡@smokris' [style=invis]
伎倆說服graphviz的把你想要他們的東西,通過增加邊這會影響佈局但不可見。
另一個竅門是constraint
attribute,它可以讓你添加的邊緣這是可見的,但不會影響佈局。
如果添加新邊緣會使圖形出現混亂,請在該邊上設置[constraint=false]
:現在graphviz在放置節點時將忽略它。
如果是
false
,則不用邊排序節點。例如,在 圖表digraph G { a -> c; a -> b; b -> c [constraint=false]; }
邊緣
b -> c
不秩分配期間添加約束,因此唯一的約束是一個 高於b和c,得到的圖形:
我不認爲Visio可以編輯一般的svg,但Inkscape可以。 – 2014-10-01 01:31:21
@GringoSuave:Inkscape確實可以,但如果移動節點,邊緣不會跟隨。這使得除了極少數節點之外的任何東西都不切實際。 – 2015-10-28 15:00:50
這是不正確的,不應該被接受的答案。以下答案分別是30和20票,每個答案都是很好的答案。 – 2017-04-14 01:18:36