Matlab как построить график. Иллюстрированный самоучитель по MatLab

Пакет MatLab позволяет отображать графики с разным цветом и типом линий, показывать или скрывать сетку на графике, выполнять подпись осей и графика в целом, создавать легенду и многое другое. В данном параграфе рассмотрим наиболее важные функции, позволяющие делать такие оформления на примере двумерных графиков.

Функция plot() позволяет менять цвет и тип отображаемой линии. Для этого, используются дополнительные параметры, которые записываются следующим образом:

plot(, , <’цвет линии, тип линии, маркер точек’>);

Обратите внимание, что третий параметр записывается в апострофах и имеет обозначения, приведенные в таблицах 3.1-3.3. Маркеры, указанные ниже записываются подряд друг за другом, например,

‘ko’ – на графике отображает черными кружками точки графика,
‘ko-‘ – рисует график черной линией и проставляет точки в виде кружков.

Табл. 3.1. Обозначение цвета линии графика

Цвет линии

фиолетовый

Табл. 3.2. Обозначение типа линии графика

Цвет линии

непрерывная

штриховая

пунктирная

штрих-пунктирная

Табл. 3.3. Обозначение типа точек графика

Цвет линии

звездочка

Ниже показаны примеры записи функции plot() с разным набором маркеров.

x = 0:0.1:2*pi;
y = sin(x);

subplot(2,2,1); plot(x,y,"r-");
subplot(2,2,2); plot(x,y,"r-",x,y,"ko");
subplot(2,2,3); plot(y,"b--");
subplot(2,2,4); plot(y,"b--+");

Результат работы фрагмента программы приведен на рис. 3.7. Представленный пример показывает, каким образом можно комбинировать маркеры для достижения требуемого результата. А на рис. 3.7 наглядно видно к каким визуальным эффектам приводят разные маркеры, используемые в программе. Следует особо отметить, что в четвертой строчке программы по сути отображаются два графика: первый рисуется красным цветом и непрерывной линией, а второй черными кружками заданных точек графика. Остальные варианты записи маркеров очевидны.

Рис. 3.7. Примеры отображения графиков с разными типами маркеров

Из примеров рис. 3.7 видно, что масштаб графиков по оси Ox несколько больше реальных значений. Дело в том, что система MatLab автоматически масштабирует систему координат для полного представления данных. Однако такая автоматическая настройка не всегда может удовлетворять интересам пользователя. Иногда требуется выделить отдельный фрагмент графика и только его показать целиком. Для этого используется функция axis() языка MatLab, которая имеет следующий синтаксис:

axis([ xmin, xmax, ymin, ymax ]),

где название указанных параметров говорят сами за себя.

Воспользуемся данной функцией для отображения графика функции синуса в пределах от 0 до :

x = 0:0.1:2*pi;
y = sin(x);

subplot(1,2,1);
plot(x,y);
axis();

subplot(1,2,2);
plot(x,y);
axis();

Из результата работы программы (рис. 3.8) видно, что несмотря на то, что функция синуса задана в диапазоне от 0 до , с помощью функции axis() можно отобразить как весь график, так и его фрагмент в пределах от 0 до .

Рис. 3.8. Пример работы функции axis()

В заключении данного параграфа рассмотрим возможности создания подписей графиков, осей и отображения сетки на графике. Для этого используются функции языка MatLab, перечисленные в табл. 3.4.

Таблица 3.4. Функции оформления графиков

Название

Описание

Включает/выключает сетку на графике

title(‘заголовок графика’)

Создает надпись заголовка графика

xlabel(‘подпись оси Ox’)

Создает подпись оси Ox

ylabel(‘подпись оси Oy’)

Создает подпись оси Oy

text(x,y,’текст’)

Создает текстовую надпись в координатах (x,y).

Рассмотрим работу данных функций в следующем примере:

x = 0:0.1:2*pi;
y = sin(x);

plot(x,y);
axis();
grid on;
title("The graphic of sin(x) function");
xlabel("The coordinate of Ox");
ylabel("The coordinate of Oy");
text(3.05,0.16,"\leftarrow sin(x)");

Из результата работы данной программы, представленного на рис. 3.9, видно каким образом работают функции создания подписей на графике, а также отображение сетки графика.

Таким образом, используя описанный набор функций и параметров, можно достичь желаемого способа оформления графиков в системе MatLab.

Рис. 3.9. Пример работы функций оформления графика

3. Трёхмерная графика .

Графики функций двух переменных представляют из себя куски поверхностей, нависающие над областями определения функций. Отсюда ясно, что изображение графиков функций двух переменных требует реализации "трёхмерной графики" на пл оском экране дисплея компьютера.

Высокоуровневая графическая подсистема MATLABа автоматически реализует трёхмерную графику без специальных усилий со стороны пользователя. Пусть в точке с координатами x1,y1 вычислено значение функции z=f(x,y) и оно равно z1. В некоторой другой точке (то есть при другом значении аргументов) x2,y2 вычисляют значение функции z2. Продолжая этот процесс, получают массив (набор) точек (x1,y1,z1), (x2,y2,z2), … (xN,yN,zN) в количестве N штук, расположенных в трёхмерном пространстве. Специальные функции системы MATLAB проводят через эти точки гладкие поверхности и отображают их проекции на плоский дисплей компбютера.

Чаще всего точки аргументов расположены в области определения функции регулярно в виде прямоугольной сетки (то есть матрицы). Такая сетка точек порождает две матрицы одной и той же структуры: первая матрица содержит значения первых координат этих точек (x - координат), а вторая матрица содержит значения вторых координат (y - координат). Обозначим первую матрицу как X, а вторую - как Y. Есть ещё и третья матрица - матрица значений функции z=f(x,y)при этих аргументах. Эту матрицу обозначим буквой Z.

Простейшей функцией построения графика функции двух переменных в системе MATLAB является функция

plot3(X , Y , Z)

где X, Y и Z - матрицы одинаковых размеров, смысл которых мы только что объяснили.

В системе MATLAB имеется специальная функция для получения двумерных массивов X и Y по одномерным массивам x, y.

P P> Пусть по оси x задан диапазон значений в виде вектора

u = -2: 0.1: 2

а по оси y этот диапазон есть

v = -1: 0.1: 1

Для получения матриц X и Y, представляющих первые и вторые координаты получающейся прямоугольной сетки точек используют специальную функцию системы MATLAB:

[ X , Y ] = meshgrid(u, v)

Как мы видим, эта функция получает на входе два одномерных массива (вектора), представляющие массивы точек на осях координат, и возвращает сразу два искомых двумерных массива. На прямоугольной сетке точек вычисляем значения функции, например функции exp:

Z = exp(- X.^2 - Y.^2)

Наконец, применяя описанную выше функцию plot3,получаем следующее изображение трёхмерного графика этой функции:

Из этого рисунка видно, что функция plot3 строит график в виде набора линий в пространстве, каждая из которых является сечением трёхмерной поверхности плоскостями, параллельными плоскости yOz. По-другому можно сказать, что каждая линия получается из отрезков прямых, соединяющих набор точек, координаты которых берутся из одинаковых столбцов матриц X, Y и Z. То есть, первая линия соответствует первым столбцам матриц X, Y Z; вторая линия - вторым столбцам этих матриц и так далее.

Для построения трёхмерных линий, задаваемых параметрически применяется другая форма вызова функции plot3:

plot3(x, y, z)

где x, y и z являются одномерными массивами координат точек, которые и нужно последовательно соединить отрезками прямых. Например, следующий фрагмент кода

t = 0: pi/50: 10*pi ;

x = sin(t);

y = cos(t);

plot3(x , y , t);

grid on

где применена известная по плоским графикам команда

grid on

для проставления сетки координатных значений в области построения графика (также допустимо использовать команды и функции по оформлению графиков, ранее рассмотренные для "плоского" случая), позволяет построить винтовую линию, изображение которой показано на следующем рисунке:

Помимо этой простейшей функции система MATLAB располагает ещё рядом функций, позволяющих добиваться большей реалистичности в изображении трёхмерных графиков. Это функции mesh, surf и surfl.

Функция mesh соединяет вычисленные соседние точки поверхности графика отрезками прямых и показывает в графическом окне системы MATLAB плоскую проекцию такого объёмного "каркасно-ребристого" (по-английски зовётся wireframe mesh) тела. Вместо ранее показанного при помощи функции plot3 графика функции

exp(- X.^2 - Y.^2)

можно получить вот такое изображение

Для лучшего восприятия "объёмности" изображения разные рёбра автоматически окрашиваются в разные цвета. Кроме того (в отличие от функции plot3) осуществляется удаление невидимых линий. Если вы считаете, что изображённое ребристое тело является прозрачным и не должно скрывать задних линий, то можно ввести команду hidden off , после чего такие линии появятся на изображении. Более плотного изображения поверхности можно добиться, если вместо

функции mesh применить функцию surf(X, Y, Z).

В результате получается следующее изображение представляющее плотную (непрозрачную) сетчатую поверхность, причём отдельные ячейки (грани) этой сетчатой поверхности (плоские четырёхугольники) автоматически окрашиваются в разные цвета.

С помощью функции surf получаются хотя и искусственно раскрашенные, но весьма наглядные изображения. Если же мы хотим добиться более естественных и объективных способов окрашивания поверхностей, то следует использовать функцию surfl.

Функция surfl трактует поверхность графика как материальную поверхность с определёнными физическими свойствами по отражению света. По умолчанию задаётся некоторый источник света, освещающий такую материальную поверхность, после чего рассчитываеются траектории отражённых лучей, попадающих в объектив условной камеры. Изображение в такой камере и показывается в графическом окне системы MATLAB.

Так как разные материалы по-разному отражают падающие лучи, то можно подобрать некоторый материал, чтобы получить наилучшее (с точки зрения пользователя) изображение. В частности, можно использовать функцию

colormap(copper)

с помощью которой для изображения графика выбирается набор цветов (по-английски - colormap), который характерен для света, отражающегося от медной поверхности (медь по-английски - copper). После этого применение функции

surfl(X, Y, Z)

вместо surf(X,Y,Z) приводит к получению очень реалистически выглядящего и очень наглядного графика:

Можно с такого графика убрать чёрные линии, изображающие рёбра, а также добиться ещё более плавного перехода освещения поверхности, если выполнить команду

shading interp

означающую, что теперь цвет (освещённость) будет меняться даже внутри отдельных граней (ячеек). В итоге будет получаться совсем уж реальное изображение некоторой объёмной фигуры. Лучше это или хуже для задачи изображения графиков функций двух переменных - судить конкретному пользователю.

Начиная с версии 4.0 в состав системы MATLAB входит мощная графическая подсистема, которая поддерживает как средства визуализации двумерной и трехмерной графики на экран терминала, так и средства презентационной графики. Следует выделить несколько уровней работы с графическими объектами. В первую очередь это команды и функции, ориентированные на конечного пользователя и предназначенные для построения графиков в прямоугольных и полярных координатах, гистограмм и столбцовых диаграмм, трехмерных поверхностей и линий уровня, анимации. Графические команды высокого уровня автоматически контролируют масштаб, выбор цветов, не требуя манипуляций со свойствами графических объектов. Соответствующий низкоуровневый интерфейс обеспечивается дескрипторной графикой, когда каждому графическому объекту ставится в соответствие графическая поддержка (дескриптор), на который можно ссылаться при обращении к этому объекту. Используя дескрипторную графику, можно создавать меню, кнопки вызова, текстовые панели и другие объекты графического интерфейса.

Из-за ограниченного объема данного справочного пособия в него включены только графические команды и функции с минимальными элементами дескрипторной графики. Заинтересованному читателю следует обратиться к документации по системе MATLAB, и в первую очередь к только что вышедшей из печати книге “Using MATLAB Graphics” (Natick, 1996).

Элементарные графические функции системы MATLAB позволяют построить на экране и вывести на печатающее устройство следующие типы графиков: линейный, логарифмический, полулогарифмический, полярный.

Для каждого графика можно задать заголовок, нанести обозначение осей и масштабную сетку.

Двумерные графики

  • PLOT - график в линейном масштабе
  • LOGLOG - график в логарифмическом масштабе
  • SEMILOGX, SEMILOGY - график в полулогарифмическом масштабе
  • POLAR - график в полярных координатах

Трехмерные графики

В системе MATLAB предусмотрено несколько команд и функций для построения трехмерных графиков. Значения элементов числового массива рассматриваются как z-координаты точек над плоскостью, определяемой координатами x и y. Возможно несколько способов соединения этих точек. Первый из них - это соединение точек в сечении (функция plot3), второй - построение сетчатых поверхностей (функции mesh и surf). Поверхность, построенная с помощью функции mesh, - это сетчатая поверхность, ячейки которой имеют цвет фона, а их границы могут иметь цвет, который определяется свойством EdgeColor графического объекта surface. Поверхность, построенная с помощью функции surf, - это сетчатая поверхность, у которой может быть задан цвет не только границы, но и ячейки; последнее управляется свойством FaceColor графического объекта surface. Уровень изложения данной книги не требует от читателя знания объектно-ориентированного программирования. Ее объем не позволяет в полной мере описать графическую подсистему, которая построена на таком подходе. Заинтересованному читателю рекомендуем обратиться к документации по системе MATLAB, и в первую очередь к только что вышедшей из печати книге Using MATLAB Graphics (Natick, 1996).

  • PLOT3 - построение линий и точек в трехмерном пространстве
  • MESHGRID - формирование двумерных массивов X и Y
  • MESH, MESHC, MESHZ - трехмерная сетчатая поверхность
  • SURF, SURFC - затененная сетчатая поверхность
  • SURFL - затененная поверхность с подсветкой
  • AXIS - масштабирование осей и вывод на экран
  • GRID - нанесение сетки
  • HOLD - управление режимом сохранения текущего графического окна
  • SUBPLOT - разбиение графического окна
  • ZOOM - управление масштабом графика
  • COLORMAP - палитра цветов
  • CAXIS - установление соответствия между палитрой цветов и масштабированием осей
  • SHADING - затенение поверхностей
  • CONTOURC - формирование массива описания линий уровня
  • CONTOUR - изображение линий уровня для трехмерной поверхности
  • CONTOUR3 - изображение трехмерных линий уровня

Надписи и пояснения к графикам

  • TITLE - заголовки для двух- и трехмерных графиков
  • XLABEL, YLABEL, ZLABEL - обозначение осей
  • CLABEL - маркировка линий уровня
  • TEXT - добавление к текущему графику текста
  • GTEXT - размещает заданный текст на графике с использованием мыши
  • LEGEND - пояснение к графику
  • COLORBAR - шкала палитры

Специальная графика

Раздел специальной графики включает графические команды и функции для построения столбцовых диаграмм, гистограмм, средств отображения векторов и комплексных элементов, вывода дискретных последовательностей данных, а также движущихся траекторий как для двумерной, так и для трехмерной графики. Этот раздел получил свое дальнейшее развитие в версии системы MATLAB 5.0, где специальные графические средства улучшены и существенно расширены.

Программа MatLab обладает рядом инструментов для визуализации графиков в трехмерном пространстве. Такие задачи обычно возникают при отображении графиков функций типа .

В самом простом случае, для визуализации графика в трехмерных координатных осях, используется функция

которая в качестве первых двух аргументов принимает матрицы с координатами точек по осям Ox и Oy соответственно, а в качестве третьего аргумента передается матрица значений точек по оси Oz. Рассмотрим работу данной функции на примере отображения графика функции

,

при и .

Сформируем матрицы X и Y, содержащие координаты точек данного графика по осям Ox и Oy соответственно. Данные матрицы нужны для того, чтобы функция plot3() «знала» какие реальные координаты соответствуют точке Z(i,j) матрицы значений по оси Oz. Для этого достаточно взять i-ю и j-ю компоненту матриц

Формирование матриц X и Y можно осуществить с помощью функции

Meshgrid(x,y);

языка MatLab. Здесь x и y – одномерные векторы значений координат по осям Ox и Oy соответственно, которые можно сформировать как

x=-1:0.1:1; % координаты точек по оси Ox
y=-2:0.1:2; % координаты точек по оси Oy

и, затем, вычислить матрицы

Meshgrid(x,y); % матрицы координат точек по осям Ox и Oy

В результате, матрицы X и Y будут содержать следующие первые восемь значений по строкам и столбцам:

Матрица X:

1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3

1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3

1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3

1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3

1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3

1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3

1 -0,9 -0,8 -0,7 -0,6 -0,5 -0,4 -0,3

Матрица Y:

2 -2 -2 -2 -2 -2 -2 -2

1,9 -1,9 -1,9 -1,9 -1,9 -1,9 -1,9 -1,9

1,8 -1,8 -1,8 -1,8 -1,8 -1,8 -1,8 -1,8

1,7 -1,7 -1,7 -1,7 -1,7 -1,7 -1,7 -1,7

1,6 -1,6 -1,6 -1,6 -1,6 -1,6 -1,6 -1,6

1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5

1,4 -1,4 -1,4 -1,4 -1,4 -1,4 -1,4 -1,4

1,3 -1,3 -1,3 -1,3 -1,3 -1,3 -1,3 -1,3

Используя данные матрицы, можно вычислить значения матрицы Z, следующим образом:

Z=exp(-X.^2-Y.^2);

и отобразить результат на экране

Рис. 3.10. Пример отображения графика с помощью функции plot3()

Из приведенного рисунка видно, что функция plot3() отображает график в виде набора линий, каждая из которых соответствует сечению графика функции вдоль оси Oy.

Такое представление графика не всегда удобно, т.к. набор одномерных не дает полное представление о характере двумерной плоскости. Более лучшей визуализации можно получить, используя функцию

mesh(X,Y,Z); % отображение графика в виде сетки

В результате получим следующий вид трехмерного графика (рис. 3.11).

Благодаря использованию функции mesh() получается график, образованный интерполяцией точек массивов X, Y и Z линиями по осям Ox и Oy. Кроме того, цветом указывается уровень точки по оси Oz: от самого малого значения (синего) до самого большого (красного) и производится удаление «невидимых» линий. Это позволяет лучше визуально оценивать структуру трехмерного графика по сравнению с функцией plot3(). Если же необходимо отобразить «прозрачный» график, то следует выключить режим удаления «невидимых» линий:

hidden off; % скрытые линии рисуются

В системе MatLab предусмотрена функция визуализации непрерывной поверхности в трехмерных осях

surf(X,Y,Z); % отображение непрерывной поверхности

В результате получается график, представленный на рис. 3.12.

Рис. 3.11. Результат работы функции mesh()

Рис. 3.12. Результат работы функции surf()

Функция surf() может использоваться в режиме

shading interp; % интерполяция тени на гранях графика

которая интерполирует цвет на гранях для получения более гладкого изображения поверхности (рис. 3.13). Также существует возможность менять цветовую карту отображения графика с помощью функции

colormap(<карта>); % установка цветовой карты

Например, карта с именем hot, используемая по умолчанию может быть заменена на любую другую доступную (hot, hsv, gray, pink, cool, bone copper) или созданную самостоятельно.

Рис. 3.13. Результат работы функции surf() в режиме shading interp

Следует отметить, что все три функции plot3(), mesh() и surf() могут быть использованы и с одним аргументом Z, который интерпретируется как матрица со значениями точек по оси Oz.

Для масштабирования отдельных участков трехмерных графиков, также как и в случае с двумерными графиками, используется функция

axis();

с очевидным набором параметров.

Для оформления трехмерных графиков можно пользоваться описанными ранее функциями: text, xlabel, ylabel, zlabel, title, grid , subplot.

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

где az – угол азимута; el – угол возвышения. Изменение первого угла означает вращение плоскости xOy вокруг оси Oz против часовой стрелки. Угол возвышения есть угол между направлением на камеру и плоскостью xOy.

Особенно наглядное представление о поверхностях дают сетчатые графики, использующие функциональную закраску ячеек. Например, цвет окраски поверхности z(x, у) может быть поставлен в соответствие с высотой z поверхности с выбором для малых высот темных тонов, а для больших - светлых. Для построения таких поверхностей используются команды класса surf (…) :

  • surf (X, Y, Z. С) - строит цветную параметрическую поверхность по данным матриц X, Y и Z с цветом, задаваемым массивом С;
  • surf(X.Y.Z) - аналогична предшествующей команде, где C=Z, так что цвет задается высотой той или иной ячейки поверхности;
  • surf(x.y.Z) и surf(x.y.Z.C) с двумя векторными аргументами х и у - векторы х и у заменяют первых два матричных аргумента и должны иметь длины length(x)=n и length(y)=m, где =size(Z). В этом случае вершины областей поверхности представлены тройками координат (x(j), yd), Z(1,j)). Заметим, что х соответствует столбцам Z, а у соответствует строкам;
  • surf(Z) и surf(Z.C) используют х = 1:n и у = 1:m. В этом случае высота Z - однозначно определенная функция, заданная геометрически прямоугольной сеткой;
  • h=surf (…) - строит поверхность и возвращает дескриптор объекта класса surface .

Команды axis , caxis , color-map , hold , shading и view задают координатные оси и свойства поверхности, которые могут использоваться для большей эффектности показа поверхности или фигуры.

Ниже приведен простой пример построения поверхности - параболоида:

> > = meshgrid([ - 3: 0.15: 3 ]);

> > Z = X. ^ 2 + Y. ^ 2 ;

> > Surf(X,Y,Z)

Соответствующий этому примеру график показан на рис. 6.25.

Рис. 6.25 . График параболоида с функциональной окраской ячеек

Можно заметить, что благодаря функциональной окраске график поверхности гораздо более выразителен, чем при построениях без такой окраски, представленных ранее (причем даже в том случае, когда цветной график печатается в черно-белом виде).

В следующем примере используется функциональная окраска оттенками серого цвета с выводом шкалы цветовых оттенков:

> > = meshgrid([ - 3: 0.1: 3 ]);

> > Z = sin(X). / (X. ^ 2 + Y. ^ 2 + 0.3);

> > surf(X.Y.Z)

> > colormap(gray)

> > shading interp

> > colorbar

В этом примере команда colormap(gray) задает окраску тонами серого цвета, а команда shading Interp обеспечивает устранение изображения сетки и задает интерполяцию для оттенков цвета объемной поверхности. На рис. 6.26 показан вид графика, построенного в этом примере.


Рис. 6.26 . График поверхности с функциональной окраской серым цветом

Обычно применение интерполяции для окраски придает поверхностям и фигурам более реалистичный вид, но фигуры каркасного вида дают более точные количественные данные о каждой точке.