Строим графики в MATLAB
Регулярно читаю вопросы про то, как построить график в MATLAB. Документация есть, примеры есть, а вопросы все равно остаются. Значит будем строить, начнем с простейших двумерных, в итоге сделаем набор шаблонов с картинками - заглянул в статью, скопировал, вставил.
Первая и самая часто встречающаяся функция это plot(...), параметры умышленно не пишу, сейчас будем в них разбираться.
Во-первых, стоит разделить реализации на две основные группы. Первая из них принимает два параметра plot(x, y), еслимы обозначим ось абсцисс за X, а ось ординат за Y, то наша функция последовательно наставит нам на координатной плоскости точек и единственным требованием к массивам х и у будет равенство их длин. Возьмем 4 случайные точки и построим их.
% Массив абсцисс
x = [1 4 8 -1];
% Массив Ординат
y = [4 -2 1 -3];
% Строим график
plot(x, y);
В итоге получаем следующую ломаную:
![]()
Теперь перейдем к второй группе функций, у нее только один параметр - это значения по оси ординат plot(y), значения по оси абсцисс MATLAB додумает самостоятельно, это будет массив со значениями от 0 и до length(y) - 1, соответственно точки получатся (y1 ,0), (y2 ,1) ...
% Массив Ординат
y = [4 -2 1 -3];
% Строим график
plot(y);
Массив ординат тот же, что и ранее, но результат уже другой.
![]()
Иногда автомасштабирование графика может нас неустроить и мы захотим свои пределы отображения по осям. Для примера я поставлю пределы по больше, чтобы было видно разницу.
% Массив абсцисс
x = [1 4 8 -1];
% Массив Ординат
y = [4 -2 1 -3];
% Строим график
plot(x, y);
%Настраиваем пределы отображения
xlim([-15 15]);
ylim([-15 15]);
Смотрим на результат, кстати, требование к параметрам только одно - верхний лимит, должен быть больше нижнего, какой из параметров за какой лимит отвечает очевидно из примера.
![]()
Если нужно включить сетку, то можно воспользоваться командой grid on, за одно давайте сменим функцию на какую-нибудь более красивую.
% Массив абсцисс
x = linspace(-10,10,200);
% Массив Ординат
y = sin(4*x)./exp(x);
% Строим график
plot(x,y);
% Устанавливаем пределы отображения
xlim([0 10]);
ylim([-0.4 0.8]);
% Включаем сетку
grid on;
![]()
Перед тем как займемся украшательством, рассмотрим важный вопрос, как отобразить две кривые в одних и тех же осях координат и как сделать несколько осей координат в рамках одного окна. Начнем со второго вопроса, есть такая функция subplot(cnt_Y, cnt_X, num). Предлагаю разобраться с ее параметрами, первые два задают разметку, допустим, хочу сетку 2 на 2, соответственно cnt_Y = 2, cnt_Y = 2, теперь третий параметр - это номер области построения, задав сетку два на два мы получили своего рода матрицу, представим, что ее строки вытягиваются в цепочку друг за другом и указывая номер мы выбираем позицию. Сходу непонятно, но если нарисовать картинку, то все становится прозрачо.
![]()
Отмечу также, что можно занять несколько ячеек разметки одним графиком. Теперь вернемся к вопросу построения нескольких кривых в одних осях координат. Строить будем в одном окне сразу оба по этому применим subplot. Будем строить один под другим, соответственно у нас получится subplot(2, 1, 1) и subplot(2, 1, 2).
Первый метод это подставить в plot несколько пар значений plot(x1,y1,x2,y2) второй способ применить команду hold on. Посмотрим на код и результат его работы.
% Массив абсцисс
x = linspace(-10,10,200);
% Первая кривая
y1 = sin(4*x)./exp(x);
% Вторая кривая
y2 = -sin(4*x)./exp(x); % лень матушка
% Строим график первым способом
subplot(2,1,1);
plot(x,y1,x,y2);
% Устанавливаем пределы отображения
xlim([0 10]);
ylim([-0.8 0.8]);
%Включаем сетку
grid on;
% Строим вторым способом
subplot(2,1,2);
plot(x,y1);
hold on;
plot(x,y2);
% Устанавливаем пределы отображения
xlim([0 10]);
ylim([-0.8 0.8]);
% Сетку включать не будем
![]()
Вот и настал тот момент, когда возникает вопрос: "А что на Вашем графике есть что?", чтобы он не возникал давайте научимся подписывать графики, настраивать параметры линий, отображать "легенду". Про параметры линий я скажу пару слов отдельно, а все остальное покажу в коде и там же подробно прокомментирую.
При задании спецификации линий существует два типа нотаций укорченная и полная, например, цвет можно задать параметром 'color' или сокращенно первой буквой от названия цвета.
plot(x,y1, 'color', 'red'); % Делаем линию красной в длинной нотации
plot(x,y2, 'g'); % Делаем линию зеленой в сокращенной нотации
Общепринятой практикой является запись следующих параметров в сокращенной форме тип линии (- сплошная, -- пунктирная, : точками), цвета (r, g, b и т.д. подробнее в справке) и типа маркера (o - кружочек, s - квадратик, * - звездочка), а всех остальных в полной. Посмотрим на пример, хочу пунктирную(--), красную(r) линию с квадратными маркерами(s):
plot(y,'--rs') % без асцисс тоже можно задавать параметры
Отлично, с вопросом разобрались. Теперь построим все по красоте, а одну из линий нашпигуем по полной. Относительно предыдущего примера у нас появятся заголовки, подписи осей, параметры линий, а также на втором графике оставим только одну линию.
% Массив абсцисс
x = linspace(-10,10,50); %Количество точек уменьшим, чтобы маркеры не сливались
% Первая кривая
y1 = sin(4*x)./exp(x);
% Вторая кривая
y2 = -sin(4*x)./exp(x); % лень матушка
% Строим график первым способом
subplot(2,1,1);
plot(x,y1,'--go',x,y2,'--b*'); % В таком способе тоже есть все настройки
% Устанавливаем пределы отображения
xlim([0 10]);
ylim([-0.8 0.8]);
% Заголовок для первого графика
title('Figure one title');
% Включаем сетку
grid on;
% Подписываем оси
xlabel('Time, s') ;
ylabel('Parrots, p');
% Настраиваем легенду
legend({'First curve','Second curve'},'Location','northeast')
% Строим вторым способом
subplot(2,1,2);
% Настраиваем линию по полной
plot(x,y1,'--bo',... % Зеленая пунктирная линия с маркерами-кружочками
'LineWidth',2,...% Двойная толщина линии
'MarkerSize',10,... % Задаем размер маркеров
'MarkerEdgeColor','m',... % Цвет контура маркеров
'MarkerFaceColor',[0.5,0.5,0.5]) % Заливка маркеров, RGB формат тоже OK
% Устанавливаем пределы отображения
xlim([0 10]);
ylim([-0.8 0.8]);
% Заголовок для второго графика
title('Figure two title');
% Подписываем оси
xlabel('Time, s');
ylabel('Square parrots, p^2');
![]()
Чтобы не перегружать и без того большой пример, отдельно скажу про заголовки - их тоже можно настраивать и даже сделать подзаголовок. Смотрим в коде.
[t,s] = title('MAIN TITLE','sub title','Color','red');
t.FontSize = 16;
s.FontAngle = 'italic';
Отдельно скажу, что есть еще метод суперзаголовка, но похоже он в одном из тулбоксов и в чистом MATLAB не доступен.
В принципе, для начала, я думаю, достаточно. В MATLAB еще полно разнообразной графики, будет итересно - продолжим гистограммами, полярными диаграммами, поверхностями и т.д.
Комментарии