2015-09-14 4 views
3

Я попытался создать сюжет с двумя YAxis, как это:Индивидуальные линии и оси стили с plotyy

x=linspace(0,20); 
y1=linspace(10,10); 
y2=x.^2; 
y3=y2-y1; 
[hAx,hLine1,hLine2]=plotyy([x',x'],[y1',y2'],x,y3); 

Теперь у меня есть две проблемы с этим кодом:

  1. Я могу изменить стили линий из два hLines с использованием hLine1.LineStyle = ':';, но я не могу изменить стили двух строк, из которых состоит hLine1. Кто-нибудь знает как это сделать?
  2. Я не могу использовать hLine2.YLim = [0 100], чтобы вручную регулировать пределы y, указанные на 2-й оси y.

После того как я не смог решить эту проблему с помощью plotyy, я искал документацию MATLAB и нашел другой способ реализации моего участка, который я думал, что может быть проще в обращении:

x=linspace(0,20); 
y1=linspace(10,10); 
y2=x.^2; 
y3=y2-y1; 

figure 
hold on; 
line(x,y1,'Color','r') 
line(x,y2,'Color','y') 
ax1 = gca; 
ax2 = axes('Position',ax1.Position,'YAxisLocation','right'); 
line(x,y3,'Parent',ax2,'Color','b') 

Проблемы вот, что он даже не показывает первую и вторую строки, а только третий, и я не знаю почему. Я бы предпочел решить проблему с помощью plotyy, но если это невозможно, я бы по достоинству оценил решение для второй части кода.

ответ

1

Я думаю, вы не заметили, что выходы plotyy являются массивами объектов, а не отдельными объектами.

x=linspace(0,20); 
y1=linspace(10,10); 
y2=x.^2; 
y3=y2-y1; 

[hAx,hLine1,hLine2]=plotyy([x',x'],[y1',y2'],x,y3); 
hLine1(1).LineStyle = '--'; 
hLine1(2).LineStyle = ':'; 

% either this 
ylim(hAx(2), [0 110]); 

% or alternatively 
f=gcf; ylim(f.Children(2), [0 110]); 
+0

Благодарим вас, и вы правы, я этого не заметил, поэтому я мог себе представить, так как у Matlab на самом деле есть массивы EVERYWHERE .... Но илим ничего не работает, Matlab говорит мне, что функция "subsindex" не определен для значений класса 'matlab.graphics.axis.Axes'. " для этой строки 'ylim()'. – Max

+0

@Max Любопытно, какую версию Matlab вы используете? В качестве альтернативы вы можете вручную получить ручку для каждой оси (см., Например, http://stackoverflow.com/questions/3938348/matlab-how-to-obtain-all-the-axes-handles-in-a-figure-handle). – Sheljohn

+0

@john Я использую Matlab R2015a. я попробую вашу предложенную альтернативу позже в этот день, даю обратную связь и, вероятно, приму ваш ответ! Еще раз спасибо :) – Max

1

Вы не видите первые две строки, потому что по осям по умолчанию белые. Установка Color свойства вторых осей объект для 'none' должен дать вам то, что вы ищете:

x=linspace(0,20); 
y1=linspace(10,10); 
y2=x.^2; 
y3=y2-y1; 

figure 
hold on; 
line(x,y1,'Color','r') 
line(x,y2,'Color','y') 
ax1 = gca; 
ax2 = axes('Position',ax1.Position,'YAxisLocation','right', 'Color', 'none'); 
line(x,y3,'Parent',ax2,'Color','b') 

the plot

EDIT: Я также рекомендую проверить linkaxes, если вы собираетесь быть масштабирование/панорамирование ваших осей и синхронизация одной или всех осей.

+0

Да, это сработало, но я все еще пытаюсь пойти с «сюжетным» решением, предоставленным sh3ljohn. но что вы подразумеваете под «проверкой» ссылок? как 'linkaxes ([ax1, ax2], 'off');'? – Max

+0

Когда вы используете 'plotyy', он связывает ваши оси x для вас, поэтому, если вы увеличиваете или панорамируете свои сюжеты, он обновляет границы обеих осей.Использование 2-осевого решения объекта не делает этого, поэтому, если вы хотите, то вы должны установить его самостоятельно. – excaza

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