2012-01-07 10 views
19

У меня есть следующий код, и я хочу объединить графики фазового пространства в одну фигуру.Несколько графиков на одной фигуре

Я закодировал функции, но я не знаю, как заставить MATLAB поместить их на одну фигуру. Как вы видите, это переменные r, a, b и d что меняется. Как их объединить?

Я также хотел бы построить векторное поле этих графиков фазового пространства, используя команду quiver, но это просто не работает.

%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]; 

ответ

28

Ну, есть несколько способов, как несколько рядов данных могут отображаться на одном рисунке.

Я буду использовать небольшой набор примеров данных, вместе с соответствующими цветами:

%% 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 

Прежде всего, когда вы хотите, все на той же оси, то вам нужно 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

Вы видите, что это правильно во многих случаях, однако, это может стать громоздким, когда динамический диапазон обоих количеств s сильно различаются (например, значения u меньше 1, а значения v намного больше).

Во-вторых, если у вас много данных или разных величин, можно также использовать subplot для разных осей. Я также использовал функцию linkaxes для привязки осей в направлении x. Когда вы увеличите масштаб одного из них в MATLAB, другой отобразит тот же диапазон x, что позволяет упростить проверку больших наборов данных.

%% 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

Андрос и Норрис делают тратить некоторое пространство, но они позволяют сохранить некоторые данные вместе без overpopulating сюжет.

Наконец, в качестве примера для более сложного метода для построения различных количеств на тот же рисунок, используя функцию plotyy (или еще лучше: yyaxis функции, так как 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

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

Конечно, вам не удастся использовать комбинацию этих методов вместе: hold on и plotyy и subplot.

редактировать:

Для quiver, я редко использую эту команду, но так или иначе, вам повезло, я написал код, некоторое время назад, чтобы облегчить векторные поля участков. Вы можете использовать те же методы, что описаны выше. Мой код далек от строгой, но здесь идет:

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'); 

Когда называется:

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'); 

это дает: Quiver plot

Если вы хотите больше указаний, я нашел that link in my source очень полезно (хотя и плохо отформатирован).

Кроме того, вы можете взглянуть на справку MATLAB, это действительно здорово. Просто введите help quiver или doc quiver в MATLAB или используйте приведенные выше ссылки (они должны содержать то же содержимое, что и doc).

+0

Здравствуйте, еще раз. Большое спасибо за вашу помощь. Теперь мне удалось нарисовать все фигуры на одной фигуре (посмотрите на мою фигуру - это выглядит хорошо :)) Не могли бы вы помочь мне также наложить вектор, поданный с помощью команды колчана? ... user1135423

3

Если вы хотите, чтобы все графики на одном рисунке, вызовите команду рисунка только один раз. Используйте команду в команде после первого вызова команды plot, чтобы последовательные вызовы на график не перезаписывали предыдущие графики.

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