Вопрос:

Несколько сюжетов на одной фигуре

matlab matlab-figure

51647 просмотра

2 ответа

103 Репутация автора

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

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

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

%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];
Автор: user1135423 Источник Размещён: 07.01.2012 08:39

Ответы (2)


3 плюса

3502 Репутация автора

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

Автор: Kavka Размещён: 07.01.2012 09:59

29 плюса

4568 Репутация автора

Решение

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

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

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

Способ 1

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

Во-вторых, когда у вас много данных или разных количеств, можно также использовать subplotразные оси. Я также использовал функцию, linkaxesчтобы связать оси в направлении х. Когда вы увеличиваете один из них в 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)

Способ 2

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

Наконец, в качестве примера для более сложного метода для построения различных величин на одном и том же рисунке с использованием 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'); 

Способ 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'); 

это дает: Колчан

Если вам нужны дополнительные указания, я нашел эту ссылку в моем источнике очень полезной (хотя и плохо отформатированной).

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

Автор: Egon Размещён: 07.01.2012 10:18
Вопросы из категории :
32x32