0

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 がノードで機能しないのはなぜですか?

4

0 に答える 0