• Регистрация
Хасбулат Нурмагомедов
Хасбулат Нурмагомедов +43.63
н/д

Строим графики в MATLAB

24.10.2020

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

Теги

    24.10.2020

    Комментарии