Расстояние между меткой оси и осью в фигуре MATLAB

Я рисую некоторые данные с помощью MATLAB, и я хотел бы отрегулировать расстояние между меткой оси и самой осью. Однако просто добавление бита к свойству "Позиция" метки делает ярлык выведенным из окна рисунка. Есть ли свойство "margin" или что-то подобное?

enter image description here

В приведенном выше рисунке я хотел бы увеличить расстояние между цифрами и меткой "Время (ы)", автоматически увеличивая размер фигур, чтобы метка не выходила за пределы.

Вот как я устанавливаю фигуру/ось.

figure;
set(gca, ...
    'Box'         , 'off'                        , ...
    'LooseInset'  , get(gca, 'TightInset') * 1.5 , ...
    'TickDir'     , 'in'                         , ...
    'XMinorTick'  , 'off'                        , ...
    'YMinorTick'  , 'off'                        , ...
    'TickLength'  , [.02 .02]                    , ...
    'LineWidth'   , 1                            , ...
    'XGrid'       , 'off'                        , ...
    'YGrid'       , 'off'                        , ...
    'FontSize'    , 18                           );

Ответ 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'.

Ответ 2

Вы можете выполнить это, отрегулировав положение оси как xlabel. Я также предлагаю использовать "нормированные" единицы, поэтому ваше позиционирование не зависит от диапазона данных. Вот пример:

figure
plot(rand(1,10))

set(gca, 'Units', 'Normalized');
pos = get(gca, 'Position');
offset = 0.1;
set(gca, ...
    'Box'         , 'off'                        , ...
    'LooseInset'  , get(gca, 'TightInset') * 1.5 , ...
    'TickDir'     , 'in'                         , ...
    'XMinorTick'  , 'off'                        , ...
    'YMinorTick'  , 'off'                        , ...
    'TickLength'  , [.02 .02]                    , ...
    'LineWidth'   , 1                            , ...
    'XGrid'       , 'off'                        , ...
    'YGrid'       , 'off'                        , ...
    'FontSize'    , 18                           , ...
    'Position'    , pos + [0, offset, 0, -offset]);

h = xlabel('Time (s)');
set(h, 'Units', 'Normalized');
pos = get(h, 'Position');
set(h, 'Position', pos + [0, -offset, 0]);

Ответ 3

Я знаю, что на это был дан ответ и все, но это (в некоторой степени) более простой способ:

relative_offset = 1.5;
close all;
figure(99);clf
plot(rand(1,10))
xlabel('The x-axis')
xh = get(gca,'XLabel'); % Handle of the x label
pause(0.2)
set(xh, 'Units', 'Normalized')
pause(0.2)
pos = get(xh, 'Position');
set(xh, 'Position',pos.*[1,relative_offset,1])

Я включил команды паузы, так как моя система будет опережать себя каким-то странным образом.

/Niels