Graphviz (neato を使用) は、制御点がエッジに対して定義されていない場合、ラベルの位置を無視します。
ラベルを配置する方法を総当たりすることはできますが、実際の問題を知らずにこれを行っています。
曲線制御点が事前に定義されていないエッジで、graphviz による lp、xlp の上書きを停止する方法はありますか?
lp がノードで機能しないのはなぜですか?
ノードとエッジを配置し、エッジ カーブを定義する場合にのみ、エッジ ラベルを配置できます。
# manual_edge.dot
digraph G {
A [label = "A" xlabel="a" pos="0,100" lp="200,100!" xlp="300,100!" ]
B [label = "B" xlabel="b" pos="100,0" lp="200,0!" xlp="300,0!" ]
A -> B
[pos="0,100 0,0 0,0 100,0" ]
[label = "A->B" xlabel="a->b" lp="200,50!" xlp="300,50!" ]
}
位置を定義するのは簡単ですが、曲線を定義するのは少し面倒です。そうしないと、エッジ ラベルの位置が機能しません。
# edge.dot
digraph G {
A [label = "A" xlabel="a" pos="0,100" lp="200,100!" xlp="300,100!" ]
B [label = "B" xlabel="b" pos="100,0" lp="200,0!" xlp="300,0!" ]
A -> B
[label = "A->B" xlabel="a->b" lp="200,50!" xlp="300,50!" ]
}
ドット出力をエクスポートすると、エッジ カーブを定義しないと、ラベルの位置が上書きされることがわかります
$ dot -Tdot -Kneato -n2 -o ./output.dot ./edge.dot
A -> B [label="A->B",
lp="30.532,60.968",
pos="e,84.997,15.003 15.188,84.812 31.877,68.123 58.839,41.161 77.877,22.123",
xlabel="a->b",
xlp="33.032,45.968"];
この動作を回避するために、処理に耐えられる無意味な属性に値を入れ、正規表現を使用してファイルをクリーンアップしてから、neato に戻しています。
...
[label = "A->B" xlabel="a->b" zzzzl="200,50!" zzzzxl="300,50!" ]
...
...
A -> B [label="A->B",
lp="30.532,60.968",
pos="e,84.997,15.003 15.188,84.812 31.877,68.123 58.839,41.161 77.877,22.123",
xlabel="a->b",
xlp="33.032,45.968",
zzzzl="200,50!",
zzzzxl="300,50!"];
...
zzzzzl を lp に、zzzzzzxl を xlp に変換すると、ダイアグラムが機能します。これは、属性が複数回設定されると、最後の値が使用されるためです。
dot -Tpng -Kneato -n2 -O ./output.dot
これは私が望むものを手に入れますが、少し長文です。エッジでgraphvizがlp、xlpを上書きするのを止める方法はありますか? lp がノードで機能しないのはなぜですか?