Как установить размер вывода в GraphViz для формата dot?

Я хочу убедиться,что все узлы находятся в некотором диапазоне (скажем, [0,0, W, H]) после макета.

я решил, что ограничивающая коробка будет решением, используя , а как точка и neato просто переписать его.

например мой график:

strict digraph {
    1,2,3;
    1 -> 3;
    3 -> 2;
}

выход neato -Gbb="0,0,50,50" -T dot file.txt:

strict digraph {
        graph [bb="0,0,120.49,162.36"];
        node [label="N"];
        1        [height=0.5,
                pos="27,18",
                width=0.75];
        3        [height=0.5,
                pos="70.233,75.918",
                width=0.75];
        1 -> 3   [pos="e,57.954,59.469 39.043,34.133 43.004,39.441 47.504,45.468 51.827,51.261"];
        2        [height=0.5,
                pos="93.485,144.36",
                width=0.75];
        3 -> 2   [pos="e,87.436,126.56 76.221,93.545 78.643,100.67 81.496,109.07 84.177,116.97"];
}

Я получаю те же позиции для любого значения bb, или любую комбинацию size и dpi.

что мне нужно, это иметь все узлы в пределах данного окна.

какие предложения как это сделать?

полная версия:

Я использую * graphviz_layout * from networkx макет мой график. Я рисую график с pyprocessing. Я хочу избежать повторного масштабирования результатов из * graphviz_layout*, если есть способ сказать neato мои границы вместо этого.

1 ответов


вот версия TL; DR:

для создания изображения 900 на 1500 пикселей PNG из графика в foo.gv вы можете запустить:

dot -Tpng -Gsize=9,15\! -Gdpi=100 -ofoo.png foo.gv

чтобы получить изображение, которое ровно 900 пикселей в ширину или 1500 в высоту, но не обязательно оба; а затем:

convert foo.png -gravity center -background white -extent 900x1500 final.png

для заполнения изображения пробелами, так что это ровно 900 на 1500 пикселей; где convert является частью ImageMagick люкс.

вот и вся объяснение:

уточнения:

  1. на bb атрибут помечается как "только для записи", поэтому ни один из движков компоновки Graphviz, скорее всего, не будет уважать любые значения, которые вы отправляете перед обработкой.

  2. в общем случае, Graphviz может генерировать как векторную (масштабируемую), так и растровую графику, поэтому DPI не всегда является значимой метрикой.

    в частности, dpi атрибут действителен только для выходных форматов bitmap и SVG.

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

возьмем в качестве примера произвольный граф.

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

по умолчанию точка генерируется PNG рендеринга этого графика может быть создана с помощью команды:

gvgen -dh3 | dot -Tpng -oexample.png

когда я это делаю, я получаю 275 x 347 пикселей PNG-формат (растровое изображение). (Как сообщает file example.png.)

на size атрибут позволяет рекомендовать максимальную или желаемую высоту и ширину для выходного изображения в дюймах. То есть, атрибут size=3,5 сообщает Graphviz для создания изображения 3 на 5 дюймов максимум. Если изображение меньше 3 на 5 Для начала, Graphviz оставит его в покое. Если изображение больше, чем 3 на 5 дюймов для начала, Graphviz будет масштабировать его до тех пор, пока он не поместится в холст 3 на 5 дюймов (сохраняя соотношение сторон исходного изображения).

добавление восклицательного знака изменяет size атрибут от максимального размера до нужные размер. Теперь, если и размеры меньше указанного размера, чертеж масштабируется до по крайней мере один размер равен указанному размеру.

например, работает:

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -oexample.png

(обратите внимание, что \! избегает восклицательного знака для bash. В файле DOT вы просто напишете size=3,5!.)

генерирует изображение 288 x 363 пикселей, немного больше в обоих измерениях, чем по умолчанию.

как ДОТ придумала эти цифры? Ну, значение DPI Graphviz по умолчанию составляет 96 пикселей на дюйм. При таком разрешении a 3 на 5 дюйма изображение 288 на 480 пикселей изображения. Механизм компоновки просто масштабировал изображение до тех пор, пока хотя бы один из размеров не соответствовал желаемому размеру.

вы можете переопределить значение DPI по умолчанию, используя dpi атрибут, например:

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=200 -oexample.png

теперь сгенерированное изображение измеряет 600 на 757 пикселей. Опять же, Graphviz просто масштабировал изображение до тех пор, пока один из размеров не соответствовал желаемому размеру (но при этом разрешении изображение 3 на 5 дюймов является изображением 600 на 1000 пикселей).

следовательно, если вы хотите создать изображение, содержащее произвольное количество пикселей, вам нужно установить оба size и dpi надлежащим образом.

то есть, предположим, вы хотите создать изображение размером 900 на 1500 пикселей. Ты мог бы ... использовать:

gvgen -dh3 | dot -Tpng -Gsize=9,15\! -Gdpi=100 -oexample.png

или

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -oexample.png

или еще:

gvgen -dh3 | dot -Tpng -Gsize=900,1500\! -Gdpi=1 -oexample.png

(но в то время как последний, казалось, работал для меня в quick test, я бы рекомендовал придерживаться более обычного значения DPI на всякий случай.)

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

вот тут ratio атрибут вступает в игру.

команды:

gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -Gratio=fill -oexample.png

должно дать вам изображение с точным размером, который вы ищете, но с парой оговорок:

  • на практике, кажется, иногда дают немного другой размер, чем хотелось бы. Например, когда я запускаю команду выше, я получаю изображение 900 на 1472 пикселя (а не 900 1500). Я не знаю, связано ли это с ошибкой округления или что.

  • для этого Graphviz должен масштабировать макет независимо в каждом измерении. Он достаточно умен, чтобы масштабировать планировка, а не изображения, поэтому изображение не искажается как таковое, но в зависимости от того, насколько отличается ваше запрашиваемое соотношение сторон от "естественного" соотношения сторон макета, горизонтальное и вертикальное расстояние могут выглядеть немного странный.

ratio также принимает несколько различных значений. См.документация и/или немного поэкспериментировать, чтобы увидеть, что они делают.

для чего это стоит, если вы буквально хотите изображение точных размеров пикселей, которые вы запрашиваете, мое предложение было бы позволить Graphviz масштабировать изображение так, чтобы одно из двух измерений совпадало, а затем использовать что-то вроде ImageMagick чтобы дополнить образ до точное соотношение сторон, которое вы ищете. Е. Г., команды:

convert in.png -gravity center -background white -extent 900x1500 out.png

центре изображения (с in.png) на холсте 900 на 1500 пикселей (сохранение его в out.png) путем заполнения горизонтального или вертикального размера по мере необходимости