2017-02-03 4 views
2

При генерации графиков с Matlab, когда оба минимума x и y равны нулю, я предпочитаю иметь только один нуль, обозначающий происхождение, а не обозначающий его на обеих осях.matlab - установить метку метки в начале координат

Matlab по умолчанию последний, как и

figure with 'double origin'

В то время как я хочу что-то больше, как это

figure with 'single origin'

Это может быть сделано вручную, но я пытаюсь автоматизировать процесс. Удаление меток x и y для 0, очевидно, достаточно просто. Тем не менее, я не могу получить доступ к какому-либо дескриптору позиции ярлыков меток оси, чтобы правильно разместить текстовое поле для «нового происхождения». Кажется, смещение метки метки из осей x и y может быть несколько постоянным на данном рисунке (в физических единицах, а не в нормализованных единицах), но я не знаю, является ли это стандартом для всех фигур или осей.

Любые идеи?

Я бегу Matlab 2014b.

ответ

0

Вот простой способ сделать это:

% somthing to plot: 
x = 0:0.1:2*pi; 
y = abs(sin(x)+cos(x)); 
plot(x,y) 

% get the handle for the current axes: 
ax = gca; 
% get the position of the zero tick on y-axis: 
zeroYtick = ax.YAxis.TickValues==0; 
% remove it (tick and lable) 
ax.YAxis.TickValues(zeroYtick) = []; 

Результат:

zero tick

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

% get the position of the zero tick on x-axis: 
zeroXtick = ax.XAxis.TickValues==0; 
% remove it (tick and lable) 
ax.XAxis.TickValues(zeroXtick) = []; 
% place a new zero at the origin: 
dim = [0.1 0.01 0.1 0.1]; 
annotation('textbox',dim,'String','0',... 
    'FitBoxToText','on','LineStyle','none') 

И вы получите:

zero tick 2

Преимущество annotation в том, что происхождение всегда помещается относительно угла осей, и вам не нужно знать значения галочек осей, чтобы должным образом компенсировать их.


EDIT:

Для предварительной версии 2016a вы можете использовать следующее (я написал это немного более компактный):

ax = gca; 
% remove the zero tick on y-axis (tick and lable): 
ax.YTick(ax.YTick==0) = []; 
% remove the zero tick on x-axis (tick and lable): 
ax.XTick(ax.XTick==0) = []; 
% place a new zero at the origin: 
dim = [0.1 0.01 0.1 0.1]; 
annotation('textbox',dim,'String','0',... 
    'FitBoxToText','on','LineStyle','none') 

EDIT 2:

Другая возможность для k eep 0 на месте - это привязать его к осям. это делается путем замены Parent на ось. Во-первых, нам нужен дескриптор аннотации (продолжение последнего редактирования):

t = annotation('textbox',dim,'String','0',... 
    'FitBoxToText','on','LineStyle','none'); 

затем включим Parent и установить новую позицию:

t.Parent = ax; 
t.Position(1:2) = -[0.2 0.1]; 

и, наконец, мы супер-клеить путем преобразования Units в пиксели:

t.Units = 'Pixels'; 
+0

Это именно то, что я хочу, а именно «0», чтобы быть смещенным от небольшого влево. Аннотации, похоже, делают трюк, но если вы затем измените размер фигуры, движется «0». Кроме того, я предполагаю, что вы на какой-то версии позже 2014b, потому что графические дескрипторы разные. У меня нет ручки для ax.XAxis и т. Д. Но это на самом деле не матер, я могу удалить метки ярлыков, правильно комментируя '0', где я застреваю. – Brian

+0

@Brian. Если вы слишком сильно сжимаете фигуру, то '0' неправильно настроен, в противном случае я могу изменить его размер настолько, насколько я хочу, и он придерживается своего места. Во всяком случае, я добавил версию кода для более ранних версий Matlab. – EBH

+0

изменение размера по-прежнему перемещает '0' в мою систему. Я не уверен, что у вас разные настройки, если они не на вашем, но как только я изменил размер фигуры, аннотированный «0» сдвинется вокруг, чтобы не быть расположенным в начале координат (обратите внимание, что это происходит, даже если фигура слегка измененный размер). Я, безусловно, ценю ответ, но поскольку он не совсем делает то, что я ищу. Я попытался добавить аннотацию после изменения размера фигуры с тем же результатом и попытался изменить размер как с единицами оси в нормализованных, так и в физических единицах. – Brian

0

Следующее исключает первый тик на yaxis без сдвига графика вообще. Вы можете убедиться, что правильный элемент удален, установив пределы оси, ylim([0,upper_limit]) перед удалением первого или вручную установив yticks, set(h,'yTick',my_ticks). Обратите внимание, что yTick изменяет положение клещами, в то время как yTickLabel изменит текст, появляющийся на каждой позиции yTick

h = plot([0,1],[0,1]); 
yTicks = get(h,'yTick'); 
set(h,'yTick',yTick(2:end));