Отображение элементов определенного размера

#matlab-figure

Вопрос:

Я строю многоугольник, состоящий из ребер и вершин. Я хотел бы отобразить эти элементы с определенным размером или пропорцией: независимо от того, имеет ли многоугольник 10 или 1000 вершин, я бы хотел, чтобы элементы были нарисованы с одинаковым размером. При увеличении и уменьшении векторного изображения размер элемента останется неизменным. Например, определите холст размером 100×100 дюймов и нарисуйте линии.толщиной 1 дюйм (и сохранить в формате PDF).

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

Я вижу два способа решить эту проблему, оба кажутся невозможными:

  1. Определите свойства размера для холста, а не для экрана.
  2. Выберите нужный уровень масштабирования и нарисуйте все элементы, даже если они не находятся в области обрезки рисунка (сохраните в формате 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