web-dev-qa-db-ja.com

MATLAB図の軸ラベルと軸の間の距離

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

enter image description here

上の図では、ラベルが範囲外に移動しないように、数字のサイズを自動的に拡大しながら、数字とラベル「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                           );
12
Niko

私はあなたが望むことを正確に行うべき関数を書きました。軸をまったく同じサイズと位置に保ち、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はFigureハンドルで、hAxesはAxesハンドルです。

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

EDIT2:hAxesの_'Units'_とXLabelがそれぞれ「正規化」と「データ」に戻される行を追加しました。そうすれば、サイズ変更後もフィギュアは思い通りになります。

EDIT3:XラベルとYラベルの両方で機能するように関数を変更しました。追加の入力axは_'x'_または_'y'_である必要があります。

9
ThijsW

これは、軸の位置を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]);
8
shoelzer

私はこれが答えられたことを知っていますが、これは(ある程度)より簡単な方法です:

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

私のシステムは奇妙な方法でそれ自体よりも先に進むので、一時停止コマンドを含めました。

/ニールズ

4
Clausen