Ответ 1
Ну, есть несколько способов, как несколько рядов данных могут отображаться на одном рисунке.
Я буду использовать набор данных небольшого примера вместе с соответствующими цветами:
%% 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
для привязки осей в направлении 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)
Подзаголовки теряют некоторое пространство, но они позволяют хранить некоторые данные без перенаселения сюжета.
И, наконец, в качестве примера для более сложного метода, чтобы построить различные количества на ту же фигуру, используя 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
).