Подтвердить что ты не робот

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

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

Я решил, что ограничивающая рамка будет решением с использованием атрибута bb, но и точка, и 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 * от networkx до макета моего графика. Я рисую график с pyprocessing. Я хочу избежать повторного масштабирования результатов из * graphviz_layout *, если есть способ сказать neato мои границы вместо этого.

4b9b3361

Ответ 1

Здесь версия TL; DR:

Чтобы создать изображение PNG размером 900 на 1500 пикселей из графика в 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 suite.

Вот подробное объяснение:

Чтобы уточнить:

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

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

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

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

gvgen -dh3 | dot -Tpng -oexample.png

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

Атрибут size позволяет вам рекомендовать максимальную или желаемую высоту и ширину для выходного изображения в дюймах. I.e., атрибут 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 пикселей на дюйм. При этом разрешении изображение размером 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.

I.e., предположим, что вы хотите создать изображение размером 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

(Но, хотя последний, казалось, работал у меня в быстрой проверке, я бы рекомендовал придерживаться более условного значения 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), при необходимости добавляя горизонтальное или вертикальное измерение