Несколько графиков на одном рисунке

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

Я закодировал функции, но я не знаю, как сделать 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*Na*P*N; %dP = b*a*P*Nd*P; %dx = [dN;dP]; 

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

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

     %% 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 для привязки осей в направлении 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) 

    Способ 2

    Подзаголовки теряют некоторое пространство, но они позволяют хранить некоторые данные без перенаseleniumия сюжета.

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

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

    Interesting Posts

    AngularJS, решение и неизвестный поставщик

    Mac OS X Leopard Kernel Паники становятся абсурдными

    Подделка формы с C # WebClient

    Процедура отправки сообщений iOS 6 Facebook заканчивается ошибкой «remote_app_id не соответствует сохраненному id»

    Почему я не могу написать строковый литерал, в то время как я * могу * написать строковый объект?

    Программно получать MAC-адрес устройства Android

    CGContextDrawPDFPage занимает большую часть памяти

    Кабели для построения компьютера

    c ++ ошибка компиляции: ISO C ++ запрещает сравнение между указателем и целым числом

    Wix: один файл на один компонент или несколько файлов на один компонент?

    Учитывая массив чисел, возвращаем массив продуктов всех других чисел (без деления)

    Не удается разрешить class MapActivity на Android

    RecyclerView сохраняет / восстанавливает состояние между действиями

    Почему регулярные выражения имеют экспоненциальное время работы?

    Есть ли способ получить количество меток чисел, используемых в файле jar

    Давайте будем гением компьютера.