Я написал функцию, которая должна делать именно то, что вы хотите. Он держит ось на точно такой же размере и положение, он перемещает й-метку вниз и увеличивает размер фигуры, чтобы быть достаточно большими, чтобы показать этикетку:
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'
из hAxes
и XLabel
изменены на «нормализованные» и «данные» соответственно. Таким образом, фигура остается такой, как вы хотите, после изменения размера.
EDIT3: изменена функция работы как для ярлыков X, так и Y. Дополнительный ввод ax
должен быть 'x'
или 'y'
.
Есть ли заметная разница при решении оси y? Полагаю, что в этом случае сюжет как-то нужно переместить, не так ли? – Niko
Я думаю, что код довольно легко преобразован в работу по оси y. Я сейчас в автобусе, поэтому не могу сделать это сейчас, но я посмотрю на это позже сегодня (в течение нескольких часов). – ThijsW
По какой-то причине этот метод не работает, например. 50 пиксельных смещений по оси x.В моей установке метка затем разрезается пополам. Однако в желаемом диапазоне в несколько пикселей эта функция работает как шарм, поэтому большое вам спасибо! – Niko