12

MATLABを使用していくつかのデータをプロットしていますが、軸ラベルと軸自体の間の距離を調整したいと思います。ただし、ラベルの「Position」プロパティにビットを追加するだけで、ラベルがFigureウィンドウの外に移動します。「マージン」プロパティなどはありますか?

ここに画像の説明を入力してください

上の図では、数字とラベル「Time(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 ラベルを下に移動し、ラベルを表示するのに十分な大きさになるように Figure のサイズを大きくします。

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、絶対オフセットをピクセル単位で指定する必要があります。相対オフセットが必要な場合は、この関数を簡単に書き直すことができると思います。hFigFigure ハンドルとhAxesAxes ハンドルです。

編集:関数を呼び出す前に、(質問で行ったように軸を設定します:)を使用hFig = figure;して図を作成し、軸を作成します。hAxes = axes;set(hAxes,...)

EDIT2: 'Units'ofhAxesと theXLabelがそれぞれ「normalized」と「data」に戻される行を追加しました。そうすれば、サイズを変更した後もフィギュアは希望どおりに保たれます。

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 に答える