2013-02-19 31 views
11

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

enter image description here

、Iは、数字、ラベル「時間(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       ); 

答えて

8

私はあなたが望むものを正確に行うべき関数を書いています。それはダウンX-ラベルを移動し、ラベルを表示するのに十分な大きさであることが図形の大きさを増加させる、まったく同じ大きさと位置で軸を保持:この場合offset

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 

絶対にオフセットされなければなりませんピクセル。相対的なオフセットが必要な場合は、この関数を簡単に書き直すことができると思います。 hFigは図形ハンドルで、hAxes軸ハンドルです。

EDIT:図形をhFig = figure;、軸をhAxes = axes;(図のように軸を設定します:set(hAxes,...))を作成してから関数を呼び出してください。

EDIT2:'Units'hAxesおよびXLabelがそれぞれ「正規化された」および「データ」に戻された行が追加されました。そうすることで、Figureはサイズ変更後の状態になります。

EDIT3:XラベルとYラベルの両方で機能するように修正されました。追加入力axは、'x'または'y'にする必要があります。

+0

y軸に取り組む際には、大きな違いはありますか?その場合、プロットそのものを移動する必要があると思いますよね? – Niko

+0

私はコードがかなり簡単にy軸上で動作するように変換されると思います。私は今バスに乗っているので今はできませんが、私は今夜後で見るでしょう(数時間以内) – ThijsW

+0

何らかの理由で、この方法は失敗しました。 x軸上の50ピクセルのオフセット。私のセットアップでは、ラベルは半分にカットされます。しかし、いくつかのピクセルの望ましい範囲では、この機能は魅力のように機能するので、どうもありがとう! – Niko

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]); 
+0

これは良いアプローチのようです。しかし、 'offset = 0.01;'を設定した場合、ラベルはFigureの枠に配置され、半分にカットされます。 – Niko

+0

@ニコそうだね。あなたはオフセットのために良い価値を得るために遊ぶ必要があります。軸とxlabelに異なるオフセットが必要な場合もあります。 – shoelzer

+1

これから最後の4行は、ラベルの位置を調整するのに必要なすべての行です。 –

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

そうでなければ方法。

/Niels

関連する問題