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 при использовании узлов, которые на самом деле имеют ширину и высоту.