Расстояние между ребрами и узлами в графвизе - PullRequest
6 голосов
/ 25 мая 2011

Как настроить расстояние между краями и узлами (красный), то есть внешнюю форму узла (синий)?

Diagram of distance between edges and nodes

Ответы [ 3 ]

3 голосов
/ 11 марта 2013

Вот техника, которую вы можете рассмотреть, чтобы избежать необходимости создания пользовательской формы узла.Могут возникнуть некоторые вопросы вкуса, которые вам, возможно, придется рассмотреть дальше, чтобы получить именно то, что вы хотите.

Преимущество этого метода, использующего HTML-подобные метки , заключается в том, чтопространство внутри и снаружи прямоугольника становится простым вопросом изменения внутреннего числа точек (здесь 4) и внешнего числа точек (здесь 16) соответственно.

digraph {

node [shape=none]

O [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="16" CELLPADDING="4">
<TR><TD WIDTH="70">\N</TD></TR>
</TABLE>
>]

{a,b,c,d} -> O

}

Результат:

GIF rendered by 'dot' for the above graphviz input

Вы можете изменить параметры BORDER и CELLBORDER, чтобы показать или скрыть прямоугольники.Вы можете отрегулировать их толщину, но только кратно 1 баллу.Я использовал параметр WIDTH, чтобы задать соотношение ширины и высоты, которое вызывает выравнивание всех наконечников стрелок.В противном случае некоторые из наконечников встретились бы со сторонами невидимого внешнего прямоугольника.

2 голосов
/ 26 мая 2011

Как и в предыдущем ответе, на самом деле это не просто подвиг.Используя комбинацию параметров height, width, fixedsize, labelloc и margin, вы, вероятно, сможете получить любой желаемый эффект.Маржа лучше всего, если вы хотите увеличить это расстояние, но чтобы минимизировать его, вам нужно использовать другие параметры.Например, этот график будет иметь стрелки, почти соприкасающиеся с текстом узла O.

digraph {
  node [shape="none" width=.2 height=.2 fixedsize="true" labelloc="top"];

  a -> O;
  b -> O;
  c -> O;
  d -> O;
}

В качестве альтернативы, если вы действительно хотите приложить усилия, вы можете создать пользовательскую форму узла и делай с ней что хочешь.

1 голос
/ 25 мая 2011

Это невозможно AFAIK.

Единственная доступная опция - это использование headclip, чтобы ребро проходило к центру узла или к краю внешней фигуры (как вы делали в вашем примере).

Вы можете попытаться добавить некоторые отступы к узлу, поместив его в кластер, и обрежьте края на (невидимой) границе кластера:

digraph {
  compound=true;
  subgraph cluster1 {
        style=invis;
        2;
    }
    1 -> 2[lhead=cluster1];
}

Надеюсь, кто-нибудь знает лучший способ взломать это ...

...