12

我正在用 MATLAB 绘制一些数据,我想调整轴标签和轴本身之间的距离。但是,只需在标签的“位置”属性中添加一点,标签就会移出图形窗口。是否有“保证金”属性或类似的东西?

在此处输入图像描述

在上图中,我想增加数字和标签“时间(s)”之间的距离,同时自动扩展数字大小,使标签不会超出范围。

这就是我设置图形/轴的方式。

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                           );
4

3 回答 3

9

我写了一个函数,它应该完全符合你的要求。它将轴保持在完全相同的大小和位置,它向下移动 x-label 并将图形大小增加到足够大以显示标签:

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坐标区句柄。

编辑:在调用函数之前,使用hFig = figure;和轴创建图形hAxes = axes;(然后像在问题中那样设置轴:) 。set(hAxes,...)

EDIT2:添加了'Units'ofhAxes和 theXLabel分别改回“规范化”和“数据”的行。这样,在调整大小后,图形将保持您想要的方式。

EDIT3:修改了函数以适用于 X 和 Y 标签。附加输入ax应该是'x''y'

于 2013-02-25T02:17:14.043 回答
8

您可以通过调整 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]);
于 2013-02-19T21:04:07.857 回答
4

我知道这已经得到了解答,但这(在某种程度上)是一种更简单的方法:

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])

我已经包含了暂停命令,因为否则我的系统会以某种奇怪的方式超前。

/尼尔斯

于 2014-04-30T21:41:45.810 回答