Графвиз DOT расставляет узлы по кругу, компоновка тоже «компактная» - PullRequest
19 голосов
/ 16 апреля 2010

Я на полпути, пожалуйста, смотрите правку

Хорошо, вот моя проблема, я генерирую график модуля python, включая все файлы с их функциями / методами / классами.

Я хочу расположить это так, чтобы узлы собирались в окружности вокруг своих родительских узлов, в настоящее время все находится в одном гигантском горизонтальном ряду, что делает ширину> 50 тыс. Пикселей, а также дает сбой конвертеру svg (отрисовывается только половина графика).

Я просмотрел документы , но не смог найти ничего, что могло бы сработать.

Итак, вопрос:
Есть ли простой способ сделать это, или я должен сделать все это самостоятельно? : /

EDIT:
Благодаря комментарию Эндрюса, у меня есть верный макет, единственная проблема сейчас в том, что он немного "компактен" ... поэтому вопрос в том, как это исправить?

Test

Ответы [ 3 ]

34 голосов
/ 16 апреля 2010

Я упомянул все наиболее значимые параметры, которые влияют на ваш текущий макет, а затем предложил значения для этих параметров. Тем не менее, я подозреваю, что вы можете получить нужный макет, просто применив несколько таких предложений.

  • уменьшить вес края , например, [вес = 0,5]; это сделает края длиннее, вызывая плотный кластеры, которые вы в настоящее время видите в вашем график для "разветвления".

  • избавиться от границ узла , node_A [Не цвет = нет; форма открытого текста =]; особенно для узлов овальной формы, а значительная часть общего пространство узла «не используется» (т. е. не используется для отображения метки узла).

  • явно установить размер шрифта для узлы (границы узлов увеличены, чтобы они окружали текст узла, что означает, что шрифт размер и количество текста для данного узел оказывает существенное влияние на его размер); [fontsize = 11] должен быть большим достаточно, чтобы быть разборчивым, но также уменьшить «загроможденный» внешний вид ( размер по умолчанию - 14).

  • увеличить минимальное расстояние между узлы, через 'nodesep' ; например, nodesep = 2.0; это будет прямо ответьте на ваше возражение относительно вашего графа "тоже компактный. "('nodesep' и 'ranksep' вероятно, повлияет на то, как точка рисует график больше, чем любые другие параметры для узел, ребро или график. В твоем случае, похоже у тебя всего два ранга узлов; «ranksep» устанавливает минимум расстояние между узлами отличается ранги - похоже, что все узлы которые составляют ваш график имеют того же ранга (за исключением нескольких высших уровней узлы в центрах).

  • явно установить общий размер графика , например, size = "7.75,10.25" (гарантирует, что ваш график помещается на странице 8,5 х 11 и что он занимает все пространство)

  • И одно чисто эстетическое предложение что в лучшем случае только поможет вашему график выглядит менее загроможденным: Цвет шрифта по умолчанию для обоих краев и узлы черные. Большинство из чернила на графике от этих двух структуры (особенно если вы удалить границы узла), поэтому я бы например, установить либо узел (текст) цвет шрифта или край цвет шрифта на «синий», чтобы помочь глазу различать два набора графа структур.

6 голосов
/ 24 мая 2010

Если он слишком компактный, вам может понадобиться возиться с длиной края. У вас есть несколько вариантов в зависимости от макета графика:

  1. Если ваш макет sfdp или fdp, настройте свойство graph K . По умолчанию 0,3.
  2. Для neato (или fdp) настройте свойство edge len . По умолчанию 1,0 для Neato и 0,3 для FDP.
  3. Для точки вы можете использовать свойство edge minlen , которое является минимальной длиной ребра. По умолчанию 1.

Возможно, вы захотите связываться со свойством графа model , которое определяет поведение кластеризации. В частности, попробуйте subset . Я считаю, что это обрабатывает len для вас: http://www.graphviz.org/doc/info/attrs.html#d:model

Кроме того, вы можете удалить все наложения вместе с методами масштабирования: http://www.graphviz.org/doc/info/attrs.html#d:overlap

0 голосов
/ 20 июля 2018

У меня около 500 узлов, и я использовал рекомендацию Дуга.

Это мой пример кода, который работает (в Python):

f = Digraph('companies',filename='companies.gv',
          edge_attr={'weight':'1',
                     'fontsize':'11',
                     'fontcolor':'blue',
                     'len':'4'},
          graph_attr={'fixedsize':'false', 
                      'bgcolor':'transparent'},
          node_attr={'fontsize':'11', 
                     'shape':'plaintext', 
                     'color':'none',
                     'fontcolor':'black'})

f.attr(layout="neato")
f.attr(nodesep='3')
f.attr(ranksep='3')
f.attr(size='5000,5000')
...