Graphviz: петля слева должна иметь ту же форму, что и петля справа - PullRequest
0 голосов
/ 26 сентября 2018

Рассмотрим этот небольшой график:

digraph G {
    {rank = same; node12; node11;}

    node11 [ label = "node left", shape=square ]
    node11 -> node11 [label=" i[2,9]"]
    node11 -> node12 [label=" k[2]"]
    node12 [ label = "node right", shape=square ]
    node12 -> node12 [label=" i[9]"]
}

Я преобразовал его в PDF с dot -Tpdf

$ dot -V
dot - graphviz version 2.40.1 (20161225.0304)

enter image description here

Как вы можете видеть (само-) петля левого узла и ребра, соединяющие левый и правый узлы, перекрываются.Я пытался исправить это, используя функциональность compass в Graphviz.Моей первой попыткой было: node11:w -> node11:w [label=" i[2,9]"]:

enter image description here

Однако полученная форма цикла изменилась.Я не хочу этого, и я согласен, что это выглядит уродливее .Увеличение nodesep=1; не дает вам ту же форму, что и правильная.Конечно, вы можете сделать правый цикл идентичным левому, добавив :e.Но я предпочитаю форму оригинальной правой петли.

Есть ли какие-либо другие возможности для достижения этой цели?

Кстати: рисование графика Mathematica здесь более умное: оно автоматически помещает сам цикл в другую.боковая сторона.Но ИМХО нужно много настроек, чтобы получить нейтральный стиль:

Graph[{1 -> 1, 1 -> 2, 2 -> 2}, 
 EdgeLabels -> {(1 -> 1) -> "i[2,9]", (1 -> 2) -> "k[2]", (2 -> 2) -> 
    "i[9]"}, EdgeLabelStyle -> Directive[15, Background -> White], 
 VertexSize -> 0.3, VertexShapeFunction -> "Rectangle", 
 VertexStyle -> White, EdgeStyle -> Black, 
 VertexLabels -> {1 -> Placed["node left", Center], 
   2 -> Placed["node right", Center]}]

enter image description here

И просто для ясности: это только фрагментграф.Окончательный график выглядит так:

enter image description here

1 Ответ

0 голосов
/ 03 января 2019

Вы можете сделать это примерно так:

digraph G {

  node[margin=0 _color=invis shape=none height=.2
  label=<<table BORDER="1" CELLBORDER="0" CELLPADDING="0" CELLSPACING="0">
    <tr>
        <td port="a1"></td>
        <td port="b1"></td>
        <td port="c1"></td>
        <td port="d1"></td>
        <td port="e1"></td>
    </tr>
    <tr>
        <td port="a2"></td>
        <td rowspan="3" colspan="3">
        \N
        </td>
        <td port="e2"></td>
    </tr>
    <tr>
        <td port="a3"></td>
        <td port="e3"></td>
    </tr>
    <tr>
        <td port="a4"></td>
        <td port="e4"></td>
    </tr>
    <tr>
        <td port="a5"></td>
        <td port="b5"></td>
        <td port="c5"></td>
        <td port="d5"></td>
        <td port="e5"></td>
    </tr>
  </table>>]

  x:a2:w->x:a4:w
  x:e2:e->x:e4:e
  x->y
  y:a2:w->y:a4:w
}

от viz-js.com: rendered by viz-js.com

...