Несколько сюжетов на одной фигуре
51647 просмотра
2 ответа
У меня есть следующий код, и я хочу объединить графики фазового пространства в одну фигуру.
Я кодировал функции, но не знаю, как заставить 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
Источник
Размещён: 13.11.2019 11:31
Ответы (2)
29 плюса
Ну, есть несколько способов отображения нескольких рядов данных на одном рисунке.
Я буду использовать небольшой пример данных вместе с соответствующими цветами:
%% 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');
Вы видите, что это правильно во многих случаях, однако, это может стать громоздким, когда динамический диапазон обеих величин сильно отличается (например, 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)
Сюжеты занимают немного места, но они позволяют хранить некоторые данные вместе, не перенасыщая участок.
Наконец, в качестве примера для более сложного метода для построения различных величин на одном и том же рисунке с использованием 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');
Это, конечно, выглядит многолюдно, но может пригодиться, когда у вас большая разница в динамическом диапазоне сигналов.
Конечно, ничто не мешает вам использовать комбинацию этих методов вместе: 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
).
3 плюса
Если вы хотите, чтобы все графики были на одной фигуре, вызывайте команду figure только один раз. Используйте команду hold on после первого вызова команды plot, чтобы последующие вызовы plot не перезаписывали предыдущие графики.
Автор: Kavka Размещён: 07.01.2012 09:59Вопросы из категории :
- matlab Каковы эффективные способы объединения двух структур в MATLAB?
- matlab Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?
- matlab Каков самый простой способ экспортировать данные Excel в Matlab?
- matlab Как работают свойства в объектно-ориентированном MATLAB?
- matlab Как нарисовать график поверхности без черных краев в MATLAB?
- matlab Как я могу сохранить измененное изображение в MATLAB?
- matlab Почему 24,0000 не равно 24,0000 в MATLAB?
- matlab Как мне перебрать каждый элемент в n-мерной матрице в MATLAB?
- matlab Как нарисовать многоугольник в матрице или двоичном изображении, чтобы использовать функции обработки изображений?
- matlab Компактная матричная индексация MATLAB
- matlab-figure Настройка размера фигуры на графике
- matlab-figure Как добавить линию оси X к фигуре? (MATLAB)
- matlab-figure Несколько сюжетов на одной фигуре
- matlab-figure Помечать метки галочкой жирным шрифтом (но не все)?
- matlab-figure ошибка при построении фигуры в программе Matlab
- matlab-figure Как добавить две легенды к одному сюжету в MATLAB?
- matlab-figure Как отобразить координаты и использовать ginput
- matlab-figure Как мне вставить другую фигуру в фигуру в MatLab?
- matlab-figure Запретить MATLAB для автоматической фокусировки
- matlab-figure Как создать нелинейную цветовую карту / цветную полосу?