Ответ 1
Я написал функцию, которая должна делать именно то, что вы хотите. Он удерживает оси в одинаковом размере и положении, он перемещает x-метку вниз и увеличивает размер фигуры, чтобы быть достаточно большим, чтобы показать метку:
function moveLabel(ax,offset,hFig,hAxes)
% get figure position
posFig = get(hFig,'Position');
% get axes position in pixels
set(hAxes,'Units','pixels')
posAx = get(hAxes,'Position');
% get label position in pixels
if ax=='x'
set(get(hAxes,'XLabel'),'Units','pixels')
posLabel = get(get(hAxes,'XLabel'),'Position');
else
set(get(hAxes,'YLabel'),'Units','pixels')
posLabel = get(get(hAxes,'YLabel'),'Position');
end
% resize figure
if ax=='x'
posFigNew = posFig + [0 -offset 0 offset];
else
posFigNew = posFig + [-offset 0 offset 0];
end
set(hFig,'Position',posFigNew)
% move axes
if ax=='x'
set(hAxes,'Position',posAx+[0 offset 0 0])
else
set(hAxes,'Position',posAx+[offset 0 0 0])
end
% move label
if ax=='x'
set(get(hAxes,'XLabel'),'Position',posLabel+[0 -offset 0])
else
set(get(hAxes,'YLabel'),'Position',posLabel+[-offset 0 0])
end
% set units back to 'normalized' and 'data'
set(hAxes,'Units','normalized')
if ax=='x'
set(get(hAxes,'XLabel'),'Units','data')
else
set(get(hAxes,'YLabel'),'Units','data')
end
end
В этом случае offset
должно быть абсолютным смещением в пикселях. Если вы хотите относительные смещения, я думаю, что эту функцию можно легко переписать. hFig
- это указатель фигуры и hAxes
дескриптор осей.
EDIT: создайте фигуру с помощью hFig = figure;
и осей на hAxes = axes;
(затем настройте оси, как вы делали в вопросе: set(hAxes,...)
) перед вызовом функции.
EDIT2: добавлены строки, в которых 'Units'
of hAxes
и XLabel
будут заменены на "нормализованные" и "данные" соответственно. Таким образом, фигура остается такой, как вы хотите, после изменения размера.
EDIT3: изменена функция работы как для ярлыков X, так и Y. Дополнительный вход ax
должен быть 'x'
или 'y'
.