2016-09-08 3 views
2

Как узнать точный размер и положение оси (без осевых меток и цифр)? Например, если я используюMATLAB: Точный размер и положение оси в случае равенства оси?

figure 
contourf(x,y,u,100,'linestyle','none') 
axis equal 
set(gca,'position',[0.1,0.1,0.7,0.8]) %normalized units 

Размер оси рамы/коробки является varyed в случае окна фигуры изменения размера (или с помощью axis equal), но значение get(gca,'position') остается неизменным. Например:

figure 
Z = peaks(20); 
contourf(Z,10) 
set(gca,'Units','pixels') 

get(gca,'position') 
axis equal 
get(gca,'position') 

ANS =

0.1300 0.1100 0.7750 0.8150 

после axis equal, коробка оси изменяется, но get(gca,'position') дает те же координаты: ANS =

0.1300 0.1100 0.7750 0.8150 

Мне нужно это, чтобы выровнять colorbar к коробке оси (с фиксированным зазором между ними) в случае axis equal.

+0

Ваш вопрос был неясен и следующее объясняет более легко, что вы fnid: 'цифра Z = пики (20); contourf (Z, 10) набора (GCA, 'Единица измерение', 'пиксели') прибудет (GCA, 'положение') оси равна получит (GCA, 'положение') ' – Oleg

+1

Я добавил ваш пример к моему вопрос. Теперь ясно? –

ответ

1

Когда вы звоните axis equal, соотношение сторон оси является фиксированным и свойство Position рассматривается как максимальный размер. Когда вы изменяете размер окна с рисунком, окно оси будет оставаться центрированным в прямоугольнике Position, но для поддержания того же соотношения сторон, что и раньше, оно может не занимать весь прямоугольник Position.

Если вы хотите, чтобы он занял весь прямоугольник Position, вы можете позвонить по телефону axis equal. (это может зависеть от вашей версии MATLAB, она работала для меня в R2015b).

Это также обсуждается чуть подробнее on MATLAB Central.

Чтобы ответить на ваш первоначальный вопрос, это немного сложно. Вы должны были бы получить соотношение участка коробки сторон (с использованием pbaspect() или оси PlotBoxAspectRatio свойства) и понять его:

ah = gca(); 
% Get the axes Position rectangle in units of pixels 
old_units = get(ah,'Units'); 
set(ah,'Units','pixels'); 
pos = get(ah,'Position'); 
set(ah,'Units',old_units); 
% Figure the PlotBox and axes Position aspect ratios 
pos_aspectRatio = pos(3)/pos(4); 
box_aspect = pbaspect(ah); 
box_aspectRatio = box_aspect(1)/box_aspect(2); 
if (box_aspectRatio > pos_aspectRatio) 
    % PlotBox is wider than the Position rectangle 
    box_height = pos(3)/box_aspectRatio; 
    box_dy = (pos(4)-box_height)/2; 
    box_position = [pos(1), pos(2)+box_dy, pos(3), box_height]; 
else 
    % PlotBox is taller than the Position rectangle 
    box_width = pos(4) * box_aspectRatio; 
    box_dx = (pos(3)-box_width)/2; 
    box_position = [pos(1)+box_dx, pos(2), box_width, pos(4)]; 
end 

Обратите внимание, что это даст вам положение окна в пикселях; если вы хотите его в normalized единиц, которые являются осями по умолчанию, вам необходимо нормализовать его:

fig_pos = get(get(ah,'Parent'),'Position'); 
box_position = box_position ./ fig_pos([3 4 3 4]); 
+0

Большое спасибо. К сожалению, ваш код не дает точного положения оси. Более того, это приводит к отрицательным значениям. –

+0

Вы используете трехмерный сюжет? В этом случае становится намного сложнее – KQS

+0

Я использую серфинг с видом (2). Таким образом, это 2D-сюжет. –

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

  • Нет связанных вопросов^_^