#matlab-figure
Вопрос:
Я строю многоугольник, состоящий из ребер и вершин. Я хотел бы отобразить эти элементы с определенным размером или пропорцией: независимо от того, имеет ли многоугольник 10 или 1000 вершин, я бы хотел, чтобы элементы были нарисованы с одинаковым размером. При увеличении и уменьшении векторного изображения размер элемента останется неизменным. Например, определите холст размером 100×100 дюймов и нарисуйте линии.толщиной 1 дюйм (и сохранить в формате PDF).
В настоящее время это кажется невозможным, поскольку, например, LineWidth
, MarkerSize
, и FontSize
относятся к экрану, а не к холсту. Это означает, что при увеличении масштаба рисунка элементы сохраняют свой размер на экране. Один из вариантов — масштабировать их размер в соответствии с уровнем масштабирования. Однако тогда большой многоугольник не обязательно будет соответствовать экрану.
Я вижу два способа решить эту проблему, оба кажутся невозможными:
- Определите свойства размера для холста, а не для экрана.
- Выберите нужный уровень масштабирования и нарисуйте все элементы, даже если они не находятся в области обрезки рисунка (сохраните в формате PDF).
Вопросы по теме, задаваемые о конкретных элементах, таких как линии или маркеры. Предложенные решения состояли в том, чтобы рисовать с помощью альтернативных функций, таких как patch() и rectangle().
В этом случае я полностью откажусь от неуклюжего механизма рисования matlab, экспортирую данные и буду рисовать в формате svg. Но это было бы обидно, поскольку matlab обладает мощными инструментами, такими как различные формы маркеров или график силы.
Я упускаю что-то фундаментальное или это худший дизайн, который я видел в последнее время?
Дубликат:
www.mathworks.com/matlabcentral/answers/1569953-plot-elements-of-specific-size
Комментарии:
1. То, что вы описали, в точности соответствует моему намерению, и действительно, оно похоже на растрированное изображение, но я хочу векторное. Смотрите мой комментарий пару минут назад по ссылке matlab. Рисование должно выполняться на холсте вне экрана, а не на экране, ограниченном им.
Ответ №1:
Мэтт Дж. заметил, что на самом деле при сохранении pdf нет ограничения разрешения, независимо от ограничения рисунка.
http://www.mathworks.com/matlabcentral/answers/1569953-plot-elements-of-specific-size
Затем мы можем сделать следующее:
- Нарисуйте небольшой график проверки концепции с правильной пропорцией между элементами (маркерами, краями и шрифтами). Сохраните отношение единиц измерения к точкам (
sc0
ниже). Кроме того, вы можете использовать одну и ту же константу для всех своих чертежей, учитывая коэффициент рисования по умолчанию в matlab. - Нарисуйте график любой сложности с похожими пропорциями.
- Масштабируйте его так, чтобы он имел то же соотношение, что и сохраненный.
- Сохранить в PDF.
Например:
% draw a vertical polyline with n vertices
n = 5; % polyline size
y = 0:n;
plot( zeros( size(y) ), y, '-o', 'LineWidth', 2, 'MarkerSize', 10 );
axis equal;
% scale
sc0 = 51; % ratio calculated by data_units_to_points_ratio() from the initial (designed) fig of a polyline of size 5
sc = data_unit_to_point_ratio() / sc0;
scale_fig_objects( sc );
% save
print( 'plot.pdf' );
Если вы измените n=100
, рисунок будет пропорциональным беспорядком (тонкая линия, маркеры не отображаются), но pdf будет в порядке, с той же пропорцией сегмента (от вершины до края).
Используемые функции:
% Based on Matt's suggestion
function conversionFactor = data_unit_to_point_ratio()
set( gcf, 'Units', 'points' );
DU = diff(xlim); % width of figure in data units
hfig = gcf;
P = hfig.Position(3); % width of figure in points
conversionFactor = P / DU; % conversion factor, data units to points
и
function scale_fig_objects( s )
hs = findobj;
for i = 1:length( hs )
h = hs(i);
t = h.Type;
if strcmpi( t, 'line' ) || strcmpi( t, 'GraphPlot' )
h.LineWidth = h.LineWidth * s;
h.MarkerSize = h.MarkerSize * s;
elseif strcmpi( t, 'scatter' )
h.SizeData = h.SizeData * s^2; % it's a squared factor!
elseif strcmpi( t, 'text' )
h.FontSize = h.FontSize * s;
end
end