2012-01-07 21 views
19

Tengo el siguiente código y quiero combinar gráficas de espacio de fase en una sola figura.Múltiples gráficas en una figura

He codificado las funciones, pero no sé cómo hacer que MATLAB las incluya en una sola figura. Como puede ver, son las variables r, a, b y d las que cambian. ¿Cómo los combino?

También me gustaría trazar el campo vectorial de estos gráficos de fase de espacio utilizando el comando quiver, pero simplemente no funciona.

%function lotkavolterra 
% Plots time series and phase space diagrams. 
clear all; close all; 
t0 = 0; 
tf = 20; 
N0 = 20; 
P0 = 5; 

% Original plot 
r = 2; 
a = 1; 
b = 0.2; 
d = 1.5; 

% Time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 

% Phase space plot 

figure 
quiver(N,P); 
axis([0 50 0 10]) 
%axis tight 


% Change variables 
r = 2; 
a = 1.5; 
b = 0.1; 
d = 1.5; 

%time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 


% Phase space plot 
figure 
plot(N,P); 
axis([0 50 0 10]) 

% Change variables 
r = 2; 
a = 1; 
b = 0.2; 
d = 0.5; 

% Time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 


% Phase space plot 
figure 
plot(N,P); 
axis([0 50 0 10]) 

% Change variables 
r = 0.5; 
a = 1; 
b = 0.2; 
d = 1.5; 

% Time series plots 
lv = @(t,x)(lv_eq(t,x,r,a,b,d)); 
[t,NP] = ode45(lv,[t0,tf],[N0 P0]); 
N = NP(:,1); P = NP(:,2); 
figure 
plot(t,N,t,P,' --'); 
axis([0 20 0 50]) 
xlabel('Time') 
ylabel('predator-prey') 
title(['r=',num2str(r),', a=',num2str(a),', b=',num2str(b),', d=',num2str(d)]); 
saveas(gcf,'predator-prey.png') 
legend('prey','predator') 

% Phase space plot 
figure 
plot(N,P); 
axis([0 50 0 10]) 

% FUNCTION being called from external .m file 

%function dx = lv_eq(t,x,r,a,b,d) 
%N = x(1); 
%P = x(2); 
%dN = r*N-a*P*N; 
%dP = b*a*P*N-d*P; 
%dx = [dN;dP]; 

Respuesta

28

Bueno, hay algunas formas en que se pueden mostrar series de datos múltiples en la misma figura.

voy a utilizar un poco de juego de datos de ejemplo, junto con sus correspondientes colores:

%% Data 
t = 0:100; 
f1 = 0.3; 
f2 = 0.07; 
u1 = sin(f1*t); cu1 = 'r'; %red 
u2 = cos(f2*t); cu2 = 'b'; %blue 
v1 = 5*u1.^2;  cv1 = 'm'; %magenta 
v2 = 5*u2.^2;  cv2 = 'c'; %cyan 

En primer lugar, cuando usted quiere todo en el mismo eje, que tendrá la función de hold:

%% Method 1 (hold on) 
figure; 
plot(t, u1, 'Color', cu1, 'DisplayName', 'u1'); hold on; 
plot(t, u2, 'Color', cu2, 'DisplayName', 'u2'); 
plot(t, v1, 'Color', cv1, 'DisplayName', 'v1'); 
plot(t, v2, 'Color', cv2, 'DisplayName', 'v2'); hold off; 
xlabel('Time t [s]'); 
ylabel('u [some unit] and v [some unit^2]'); 
legend('show'); 

Method 1

Vemos que esto es correcto en muchos casos, sin embargo, puede ser engorroso cuando el rango dinámico de ambos qua Las características difieren mucho (p. los valores u son más pequeños que 1, mientras que los valores v son mucho más grandes).

En segundo lugar, cuando tiene muchos datos o cantidades diferentes, también es posible usar subplot para tener diferentes ejes. También utilicé la función linkaxes para vincular los ejes en la dirección x. Al acercarse a cualquiera de ellos en MATLAB, el otro mostrará el mismo rango x, lo que permite una inspección más fácil de conjuntos de datos más grandes.

%% Method 2 (subplots) 
figure; 
h(1) = subplot(2,1,1); % upper plot 
plot(t, u1, 'Color', cu1, 'DisplayName', 'u1'); hold on; 
plot(t, u2, 'Color', cu2, 'DisplayName', 'u2'); hold off; 

xlabel('Time t [s]'); 
ylabel('u [some unit]'); 
legend(gca,'show'); 

h(2) = subplot(2,1,2); % lower plot 
plot(t, v1, 'Color', cv1, 'DisplayName', 'v1'); hold on; 
plot(t, v2, 'Color', cv2, 'DisplayName', 'v2'); hold off; 

xlabel('Time t [s]'); 
ylabel('v [some unit^2]'); 
legend('show'); 

linkaxes(h,'x'); % link the axes in x direction (just for convenience) 

Method 2

subparcelas hacen perder un poco de espacio, pero permiten mantener algunos datos juntos sin sobrepoblación de una parcela.

Finalmente, como un ejemplo de un método más complejo para trazar cantidades diferentes en la misma figura usando la función de plotyy (o mejor aún: la función de yyaxis desde R2016a)

%% Method 3 (plotyy) 
figure; 
[ax, h1, h2] = plotyy(t,u1,t,v1); 
set(h1, 'Color', cu1, 'DisplayName', 'u1'); 
set(h2, 'Color', cv1, 'DisplayName', 'v1'); 
hold(ax(1),'on'); 
hold(ax(2),'on'); 
plot(ax(1), t, u2, 'Color', cu2, 'DisplayName', 'u2'); 
plot(ax(2), t, v2, 'Color', cv2, 'DisplayName', 'v2'); 

xlabel('Time t [s]'); 
ylabel(ax(1),'u [some unit]'); 
ylabel(ax(2),'v [some unit^2]'); 

legend('show'); 

Method 3

Este ciertamente parece estar lleno, pero puede ser útil cuando tienes una gran diferencia en el rango dinámico de las señales. Por supuesto, nada le impide utilizar una combinación de estas técnicas juntas: hold on junto con plotyy y subplot.

edición:

Para quiver, rara vez usar ese comando, pero de todos modos, tienes suerte que escribí algo de código de un tiempo atrás para facilitar parcelas de campo de vectores. Puede usar las mismas técnicas que se explicaron anteriormente. Mi código está lejos de ser riguroso, pero aquí va:

function [u,v] = plotode(func,x,t,style) 
% [u,v] = PLOTODE(func,x,t,[style]) 
% plots the slope lines ODE defined in func(x,t) 
% for the vectors x and t 
% An optional plot style can be given (default is '.b') 

if nargin < 4 
    style = '.b'; 
end; 
% http://ncampbellmth212s09.wordpress.com/2009/02/09/first-block/ 
[t,x] = meshgrid(t,x); 

v = func(x,t); 
u = ones(size(v)); 
dw = sqrt(v.^2 + u.^2); 

quiver(t,x,u./dw,v./dw,0.5,style); 
xlabel('t'); ylabel('x'); 

Cuando llama como:

logistic = @(x,t)(x.* (1-x)); % xdot = f(x,t) 
t0 = linspace(0,10,20); 
x0 = linspace(0,2,11); 

plotode(@logistic,x0,t0,'r'); 

rendimientos esto: Quiver plot

Si quieres más orientación, encontré that link in my source muy útil (aunque mal formateado).

Además, es posible que desee echar un vistazo a la ayuda de MATLAB, es realmente genial. Simplemente escriba help quiver o doc quiver en MATLAB o utilice los enlaces que proporcioné arriba (estos deberían dar los mismos contenidos que doc).

+0

Hola de nuevo ... Muchas gracias por su ayuda. Ahora he logrado trazar todas las figuras en una figura (eche un vistazo a mi figura, se ve bien :)) ¿Podrían ayudarme también a trazar el vector archivado utilizando el comando temblor? ... user1135423

3

Si quiere todos los trazados en la misma figura, llame al comando figure solo una vez. Utilice el comando en después de la primera llamada al comando de trazado para que las llamadas sucesivas al trazado no sobrescriban los trazados anteriores.

Cuestiones relacionadas