FontSize для легенды изображения в Matlab - PullRequest
1 голос
/ 22 ноября 2011

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

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, Лей, 'Место', 'SouthOutside', 'FONTSIZE', 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 подавлено, все в порядке. Как я могу это исправить, если я хочу, чтобы легенда имела меньший размер?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Это тоже хорошо работает для меня ... Вы должны понимать, что LEGEND в основном создает еще один экземпляр оси внутри фигуры.

Теперь вы размещаете его, используя '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);

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

Как я уже говорил, LEGEND создает просто еще одну ось.Поэтому для окончательного контроля вы можете вручную расположить все оси на фигуре (указывайте фактические положения вместо того, чтобы полагаться на значения "outside" для свойства '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')

screenshot

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

set(gcf,'ResizeFcn',@myEventHandler)
1 голос
/ 22 ноября 2011

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

Result

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

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

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

...