2013-02-19 501 views
11

我正在用MATLAB繪製一些數據,我想調整軸標籤和軸本身之間的距離。但是,只需在標籤的「位置」屬性中添加一點,標籤就會移出圖形窗口。有沒有「保證金」財產或類似的東西?MATLAB中軸標籤和軸之間的距離圖

enter image description here

在上述圖中,我想增加號碼和標籤「時間(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標記下來,並增加了數字大小要足夠大,以顯示標籤:

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:增加了的和XLabel分別變回「歸一化」和「數據」的行。這樣,這個數字在調整大小後保持您想要的樣子。

EDIT3:修改了X和Y標籤的功能。其他輸入ax應該是'x''y'

+0

解決y軸有什麼顯着的區別?在這種情況下,我想情節本身需要移動,對吧? – Niko 2013-02-25 09:42:49

+0

我認爲代碼很容易轉換爲在y軸上工作。我現在正在乘公共汽車,所以現在不能這樣做,但我會在今晚晚些時候(幾個小時內)看看它。 – ThijsW 2013-02-25 09:54:15

+0

由於某種原因,此方法無法通過例如。在x軸上有50個像素偏移量。在我的設置中,標籤然後被切成兩半。然而,在幾個像素的理想範圍內,這個功能就像一個魅力,所以非常感謝你! – Niko 2013-02-25 17:11:58

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;',則標籤位於圖形的邊框上,因此將其切成兩半。 – Niko 2013-02-19 21:33:45

+0

@妮科那是真的。你必須四處遊玩以獲得抵消的良好價值。您可能還需要軸和xlabel的不同偏移量。 – shoelzer 2013-02-19 21:35:19

+1

最後4行是我需要調整標籤位置。 – 2015-10-06 23:47:56

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