Graphviz игнорирует атрибут размера (страница A4)

Рассмотрим следующий минимальный примерный график, который должен уместиться на странице A4

digraph G{
size="8.3,11.7!" ratio=fill;
foo->bar;
}

Компилировать с neato -Tpdf -o min_ex.pdf min_ex.gvПолученный PDF-файл имеет размеры 236 х 115 мм, а не 210 мм х 297 мм.

Graphviz игнорирует этот атрибут как для графиков, которые меньше, чем страница (например, эта), так и для тех, которые должны быть уменьшены для соответствия.

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

Итак, что я должен указать, что график всегда помещается на страницу A4, независимо от его размера?

Документация:

размер:

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

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

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

соотношение

Устанавливает соотношение сторон (высота чертежа / ширина чертежа) для чертежа. Обратите внимание, что это корректируется до применения ограничений атрибута размера. Кроме того, в расчетах обычно игнорируются размеры узлов, поэтому окончательный размер чертежа может только приблизиться к желаемому.

Если коэффициент является числовым, он принимается как желаемое соотношение сторон. Затем, если фактическое соотношение сторон меньше требуемого соотношения, высота рисования увеличивается до достижения желаемого соотношения; если фактическое соотношение больше этого желаемого, ширина рисунка увеличивается.

Если ratio = "fill" и установлен атрибут size, позиции узлов масштабируются по отдельности как по x, так и по y, так что окончательный чертеж точно заполняет указанный размер. Если оба значения размера превышают ширину и высоту чертежа, то оба значения координат каждого узла масштабируются соответственно. Однако, если какой-либо размерный размер меньше соответствующего размера на чертеже, один размер масштабируется так, чтобы конечный чертеж имел такое же соотношение сторон, как указано размером. Затем при визуализации макет будет равномерно уменьшен в обоих измерениях, чтобы соответствовать заданному размеру, что также может привести к сокращению узлов и текста. Возможно, это не то, чего хочет пользователь, но это позволяет избежать сложной проблемы, заключающейся в том, как правильно расположить узлы, чтобы уменьшить размер чертежа.

Если соотношение = "сжимать" и атрибут размера установлен, точка пытается сжать первоначальный макет, чтобы соответствовать данному размеру. Это обеспечивает более плотную упаковку узлов, но снижает баланс и симметрию. Эта функция работает только в точке.

Если соотношение = "развернуть", атрибут размера установлен, и ширина и высота графика меньше, чем значение в размере, положения узлов масштабируются равномерно до тех пор, пока хотя бы одно измерение не будет точно соответствовать размеру. Обратите внимание, что это отличается от использования размера в качестве желаемого размера, так как здесь чертеж расширяется до создания краев, а все размеры узлов и текста остаются неизменными.

Если ratio = "auto", атрибут страницы установлен, и график не может быть нарисован на одной странице, тогда размер устанавливается в "идеальное" значение. В частности, размер в данном измерении будет наименьшим целым кратным размеру страницы в этом измерении, который составляет по меньшей мере половину текущего размера. Два измерения затем масштабируются независимо до нового размера. Эта функция работает только в точке.

1 ответ

Проблема заключается в деталях об отношении:

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

Кажется, что графвиз

  • выкладывает узлы в виде точек (игнорируя размер)
  • регулирует соотношение точечных узлов (по-прежнему нет размера для узлов)
  • применяет ограничения размера графика (в нашем случае, масштабирование изображения): здесь мы уже достигли желаемых размеров, но мы еще не закончили...
  • затем точечные узлы становятся узлами с реальным размером (по умолчанию 0,5 дюйма в высоту и 0,75 дюйма в ширину)
  • и, наконец, весь результат получает добавленную маржу

Результат будет больше, чем А4.

Поэтому, если бы мы сделали узлы и отступы как можно меньше, результат должен быть относительно близок к A4.

настройка margin до 0 и узла shape в point а также их width а также height до минимальных значений со следующим графиком:

digraph G{
 ratio="fill";
 size="8.3,11.7!";
 margin=0;

 node[shape=point, height=0.02, width=0.01];
 foo->bar;
}

neato -Tpdf с этим графиком получается PDF с размерами 211x297 мм (при ширине 8,267 дюйма получится чистый 210x297 мм).


К сожалению, даже зная, как графвиз работает в отношении ratio=fillЯ не думаю, что есть простой способ убедиться, что конечный результат всегда равен A4 при использовании узлов, которые на самом деле имеют ширину и высоту.

Другие вопросы по тегам