Moises Fonseca
Moises Fonseca

Reputation: 43

How do I reach first and second plots from bode()

I know how to create the Bode plots with bode() function. If I want to overlap two or more systems frequency responses, I use

bode(sys1,sys2,...)

or

hold on

When I want to reach the plot in order to put a legend with text(), for instance, is easy to reach the second plot. Something like the figure pointer always returns to the second plot (phase graph).

i.e., if try these lines:

G = tf([1],[1 6]); figure(1); bode(G); text(10,-20,'text');
G = tf([1],[1 6]); figure(2); bode(G); text(10,-20,'text');

when I return to the first figure, with figure(1), and try

figure(1); text(10,-20,'text')

legend is displayed in the second plot (Phase plot)

I try these other lines:

P = bodeoptions; % Set phase visiblity to off
P.PhaseVisible = 'off';
G = tf([1],[1 6]);
figure(1); bode(G,P); text(10,-20,'text');
figure(1); text(10,-20,'text');

As you can see, even I turn off the phase plot visiblity, the legend is not displayed.

Essentialy, my question is, how do I reach first and second plots, one by one? I tried with subplot(), but it is pretty clear this is not the way Matlab traces these plots.

Thanks in advance.

Upvotes: 2

Views: 2611

Answers (3)

Maverick
Maverick

Reputation: 440

It all comes to getting into upper plot, since after bodeplot command the lower one is active. Intuitively one would want to call subplot(2,1,1), but this just creates new blank plot on top of if. Therefore we should do something like this:

% First, define arbitrary transfer function G(s), domain ww 
% and function we want to plot on magnitude plot.
s = tf('s');
G = 50 / ( s*(1.6*s+1)*(0.23*s+1) );
ww = logspace(0,3,5000);
y = 10.^(-2*log10(ww)+log10(150));
hand = figure;                   % create a handle to new figure
h = bodeplot(G,ww);
hold on;
children = get(hand, 'Children') % use this handle to obtain list of figure's children

% We see that children has 3 objects:
% 1) Context Menu 2) Axis object to Phase Plot 3) Axis object to Magnitude Plot

magChild = children(3);          % Pick a handle to axes of magnitude in bode diagram.
% magChild = childern(2)         % This way you can add data to Phase Plot.
axes(magChild)                   % Make those axes current
loglog(ww,y,'r');
legend('transfer function','added curve')

Upvotes: 2

Marta
Marta

Reputation: 11

The only solution I was able to perform is taking into account axis position. It is not very clean but it works. Here is the code to select mag plot:

ejes=findobj(get(gcf,'children'),'Type','axes','visible','on');
posicion=get(ejes,'pos');
tam=length(posicion);
for ii=1:tam
a=posicion{ii}(2);
vectorPos(ii)=a;
end
[valorMax,ind]=max(vectorPos); % min for choosing the phase plot
axes(ejes(ind)) 

Upvotes: 1

milad
milad

Reputation: 169

you can get magnitude and phase data separately for each system using:

[mag,phase] = bode(sys,w) 

now you can use subplot or plot to plot the diagram you want.

Upvotes: 1

Related Questions