2013-02-19 7 views
11

Я рисую некоторые данные с помощью MATLAB, и я хотел бы отрегулировать расстояние между меткой оси и самой осью. Однако просто добавление бита к свойству «Позиция» метки делает ярлык выведенным из окна рисунка. Есть ли свойство «margin» или что-то подобное?Расстояние между меткой оси и осью в фигуре MATLAB

enter image description here

В приведенном выше рисунке, я хотел бы увеличить расстояние между числами и меткой «Время (ы)», а автоматически расширяя размер фигуры так, чтобы метка не перемещается за пределы ,

Вот как я установил фигуру/ось.

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

Я написал функцию, которая должна делать именно то, что вы хотите. Он держит ось на точно такой же размере и положение, он перемещает й-метку вниз и увеличивает размер фигуры, чтобы быть достаточно большими, чтобы показать этикетку:

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 ручка осей.

EDIT: создать фигуру с помощью hFig = figure; и осей от hAxes = axes; (затем установите ось, как вы делали в этом вопросе: set(hAxes,...)) перед вызовом функции.

EDIT2: добавлены строки, в которых 'Units' из hAxes и XLabel изменены на «нормализованные» и «данные» соответственно. Таким образом, фигура остается такой, как вы хотите, после изменения размера.

EDIT3: изменена функция работы как для ярлыков X, так и Y. Дополнительный ввод ax должен быть 'x' или 'y'.

+0

Есть ли заметная разница при решении оси y? Полагаю, что в этом случае сюжет как-то нужно переместить, не так ли? – Niko

+0

Я думаю, что код довольно легко преобразован в работу по оси y. Я сейчас в автобусе, поэтому не могу сделать это сейчас, но я посмотрю на это позже сегодня (в течение нескольких часов). – ThijsW

+0

По какой-то причине этот метод не работает, например. 50 пиксельных смещений по оси x.В моей установке метка затем разрезается пополам. Однако в желаемом диапазоне в несколько пикселей эта функция работает как шарм, поэтому большое вам спасибо! – 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;', метка позиционируется на границе рисунка и, таким образом, разрезается пополам. – Niko

+0

@Niko Это правда. Вам нужно будет поиграть, чтобы получить хорошее значение для смещения. Вам также может потребоваться другое смещение для оси и 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

Смежные вопросы