FontSize для легенды изображения в Matlab

У меня есть следующий код:

X = 0:pi/100:0.25*pi;
Y1 = sin(X);
Y2 = cos(X);
Y3 = tan(X);
fh = figure('toolbar','none','menubar','none','Units','characters');
Pan1 = uipanel(fh,'Units','normalized','Position',[0 0 0.5 1],'title',...
  'Panel1');
Pan2 = uipanel(fh,'Units','normalized','Position',[0.5 0 0.5 1],'title',...
  'Panel2');
haxes = axes('Parent',Pan2,'Units', 'normalized','Position',...
[0.125 0.1 0.75 0.75]);
hplot = plot(haxes,X,Y1,X,Y2,X,Y3);
xlabel(haxes,'Time (second)');
ylabel(haxes,'Amplitude (meter)');
title(haxes,'Trigonometric functions');
Ley = {'Sine function','Cosine function','Tangent function'}; %# legend's strings values
legend(haxes,Ley,'Location','SouthOutside');
[FileName,PathName,FilterIndex] = uiputfile('*.bmp;*.png;*.jpg;*.tif','Save as');
ftmp = figure('Menu','none','Toolbar','none','Units','normalized',...
  'Position',[-1000 -1000 1 1]);
set(gcf,'PaperPositionMode','auto');
set(gcf,'InvertHardcopy','off');
new_axes = copyobj(haxes, ftmp);
legend(new_axes,Ley,'Location','SouthOutside','FontSize',8);
set(new_axes,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);
fmtgraf = {'-dbmp','-dpng','-djpeg','-dtiff'};
fmt = fmtgraf{FilterIndex};
print(ftmp,fmt,FileName,'-r0');
delete(ftmp);
delete(fh);

Как видно из кода, командная строка

легенда (new_axes, Ley, «Местоположение», «Юг снаружи», «Размер шрифта», 8);

запускается перед командной строкой

 set(new_axes,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);

Из-за этого изображение кажется обрезанным по нижней части, как показано ниже (независимо от наличия или отсутствия свойства/значения 'FontSize')

Если командная строка

 legend(new_axes,Ley,'Location','SouthOutside','FontSize',8);

запускается после командной строки

 set(new_axes,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);

теперь изображение обрезано по нижней части, но в этом случае не видно ни текста xlabel, ни поля легенды (как показано ниже)

Если 'FontSize',8 подавлен, все в порядке. Как я могу это исправить, если я хочу, чтобы легенда имела меньший размер?


person julianfperez    schedule 21.11.2011    source источник


Ответы (2)


У меня это тоже работает... Вы должны понимать, что ЛЕГЕНДА в основном создает другой экземпляр оси внутри фигуры.

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

Попробуйте немного заранее сузить основную ось графика по вертикали, чтобы дать легенде больше места...

Также имеет значение порядок команд. Сравните это:

new_axes = copyobj(haxes, ftmp);
legend(new_axes, Ley, 'Location','SouthOutside', 'FontSize',8);
set(new_axes, 'Units','normalized', 'Position',[0.1 0.1 0.8 0.8]);

против:

new_axes = copyobj(haxes, ftmp);
set(new_axes, 'Units','normalized', 'Position',[0.1 0.1 0.8 0.8]);
legend(new_axes, Ley, 'Location','SouthOutside', 'FontSize',8);

РЕДАКТИРОВАТЬ:

Как я уже упоминал, ЛЕГЕНДА создает просто еще одну ось. Поэтому для полного контроля вы можете вручную расположить все оси на фигуре самостоятельно (указать фактическое положение вместо того, чтобы полагаться на "внешние" значения для свойства 'Location', предоставляемого функцией legend). Вот пример для иллюстрации:

%# create a normal plot
clf
hAx = axes();
plot(hAx, rand(10,3))
xlabel(hAx, 'xlabel'), title(hAx,'title')

%# add a legend on the inside and record the axis outerposition (in pixels)
hLgnd = legend(hAx, {'1' '2' '3'}, 'Location','South', 'FontSize',8);
set(hLgnd, 'Units','pixels')
op = get(hLgnd,'OuterPosition');
set(hLgnd, 'Units','normalized')

%# resize the plot axis vertically to make room for the legend
set(hAx, 'Units','pixels')
pos = get(hAx,'Position');
ins = get(hAx,'TightInset');
set(hAx, 'Position',[pos(1) pos(2)+op(4) pos(3) pos(4)-op(4)])
set(hAx, 'Units','normalized')

%# move the legend to the bottom in the free space
set(hLgnd, 'Units','pixels')
set(hLgnd, 'OuterPosition',[op(1) (pos(2)-ins(2))/2 op(3) op(4)])
set(hLgnd, 'Units','normalized')

скриншот

Попробуйте это для разных размеров фигуры и перезапустите код. Обратите внимание, что если вы хотите, чтобы оси правильно корректировали свои размеры автоматически при изменении размера фигуры, вы должны сделать то же самое, что и приведенный выше код внутри обработчика событий 'ResizeFcn' фигура, то есть:

set(gcf,'ResizeFcn',@myEventHandler)
person Amro    schedule 22.11.2011
comment
Спасибо за ваш ответ. Я сделал несколько доказательств на его основе и отредактировал свой вопрос, чтобы включить их. Я думаю (хотя я не уверен), что у моей проблемы две причины: мой широкоэкранный размер и изменение свойства «Размер шрифта». Что касается последнего, в справке документации Matlab говорится, что размер шрифта и имя шрифта для строк легенды соответствуют свойствам осей FontSize и FontName. Итак, если я изменяю его через легенду команды, то FontSize осей также изменяется. - person julianfperez; 23.11.2011

Он отлично работает для меня:

Результат

Я заметил, что наши скриншоты имеют разное соотношение сторон. Возможно, ваш монитор имеет широкоформатное соотношение сторон? Параметр 'units' 'normalized', который вы применяете к новым осям, установит его размеры относительно монитора, на котором он отображается. Когда вы создаете более широкую фигуру, возможно, MATLAB обрезает легенду снизу (его графика не идеальна).

Мой совет, возможно, попробовать установить единицы измерения осей напрямую, используя 'units' 'pixels', с более квадратным соотношением сторон.

Другим вариантом может быть создание легенды с 'orientation' 'horizontal', что позволит расположить элементы с меньшей высотой, или разместить ее внутри графика, например, 'SouthEast'.

person Sam Roberts    schedule 22.11.2011
comment
Спасибо за ваш ответ. Да, вы правы: у моего монитора широкий экран. Как я уже упоминал в ответном комментарии для @Amro, после некоторых доказательств я думаю, что свойство FontSize вместе с широкоэкранным размером может быть источником проблемы. - person julianfperez; 23.11.2011