Урок №6.

Обычная графика MATLAB

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

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

Построение графиков отрезками прямых

Функции одной переменной у(х) находят широкое применение в практике математических и других расчетов, а также в технике компьютерного математического моделирования. Для отображения таких функций используются графики в декартовой (прямоугольной) системе координат. При этом обычно строятся две оси — горизонтальная X и вертикальная Y, и задаются координаты х и у, определяющие узловые точки функции у(х). Эти точки соединяются друг с другом отрезками прямых, т. е. при построении графика осуществляется линейная интерполяция для промежуточных точек. Поскольку MATLAB — матричная система, совокупность точек у(х) задается векторами X и Y одинакового размера.

Команда plot служит для построения графиков функций в декартовой системе координат. Эта команда имеет ряд параметров, рассматриваемых ниже.

Приведенный ниже пример иллюстрирует построение графиков двух функций — sin(x) и cos(x), значения функции которых содержатся в матрице Y, а значения аргумента х хранятся в векторе X:

» х=[0 1 2 3 4 5]; 

» Y=[sin(x):cos(x)]; 

» plot(x,Y)

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

Рис. 6.1. Графики двух функций в декартовой системе координат

Вот пример использования команды plot(Y):

» х=2*pi:0.02*pi:2*pi; 

» y=sin(x)+i*cos(3*x); 

» plot(y)

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

Рис. 6.2. График функции, представляющей вектор Y с комплексными элементами

Значениями константы S могут быть следующие символы.

Цвет линии

Y

Желтый

М

Фиолетовый

С

Голубой

R

Красный

G

Зеленый

В

Синий

W

Белый

К

Черный

Тип точки


.

Точка

0

Окружность

X

Крест

+

Плюс

*

Звездочка

S

Квадрат

D

Ромб

V

Треугольник (вниз)

А

Треугольник (вверх)

<

Треугольник (влево)

>

Треугольник (вправо)

Р

Пятиугольник

H

Шестиугольник

Тип линии

-

Сплошная


;

Двойной пунктир

-.

Штрих-пунктир

--

Штриховая

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

При отсутствии указания на цвет линий и точек он выбирается автоматически из таблицы цветов (белый исключается). Если линий больше шести, то выбор цветов повторяется. Для монохромных систем линии выделяются стилем.

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

» x=-2*pi:0.1*pi:2*pi;

» yl=sin(x);

» y2=sin(x).^2;

» y3=sin(x).^3:

» plot(x,yl,'-m',x,y2,'-.+r',х,у3,'--ok')

Графики функций для этого примера показаны на рис. 6.3.

Рис. 6.3. Построение графиков трех функций на одном рисунке с разным стилем линий

Здесь график функции yl строится сплошной фиолетовой линией, график у2 строится штрих пунктирной линией с точками в виде знака «плюс» красного цвета, а график уЗ строится штриховой линией с кружками черного цвета. К сожалению, на черно-белых рисунках этой книги вместо разных цветов видны разные градации серого цвета.

Графики в логарифмическом масштабе

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

» x=logspace(-1, 3); 

» loglog(x,exp(x)./x) 

» grid on

На рис. 6.4 представлен график функции ехр(х)/х в логарифмическом масштабе. Обратите внимание на то, что командой grid on строится координатная сетка.

Неравномерное расположение линий координатной сетки указывает на логарифмический масштаб осей.

Рис. 6.4. График функции ехр(x)/x в логарифмическом масштабе

Графики в полулогарифмическом масштабе

В некоторых случаях предпочтителен полулогарифмический масштаб графиков, когда по одной оси задается логарифмический масштаб, а по другой — линейный.

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

Рис. 6.5. График экспоненты в полулогарифмическом масштабе

Запись параметров (...) выполняется по аналогии с функцией plot(...). Ниже приводится пример построения графика экспоненциальной функции:

» х=0:0.5:10;

» semilogy(x,exp(x))

График функции при логарифмическом масштабе по оси У представлен на рис. 6.5.

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

Столбцовые диаграммы

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

Возможно применение этих команд и в следующем виде: bаг(...., 'Спецификация') для задания спецификации графиков, например типа линий, цвета и т. д., по аналогии с командой plot. Спецификация 'stacked' задает рисование всех n столбцов в позиции m друг на друге.

Пример построения столбцовой диаграммы матрицы размером 12x3 приводится ниже:

» % Столбцовая диаграмма с вертикальными столбцами

» bar(rand(12,3),'stacked')

» colormap(cool)

На рис. 6.6 представлен полученный график.

Рис. 6.6. Пример построения диаграммы с вертикальными столбцами

Помимо команды bar(...) существует аналогичная ей по синтаксису команда barh(...), которая" строит столбцовые диаграммы с горизонтальным расположением столбцов. Пример, приведенный ниже, дает построения, показанные на рис. 6.7.

» barh(rand(5,3),'stacked')

» colormap(cool)

Рис. 6.7. Пример построения столбцовой диаграммы с горизонтальными столбцами

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

Построение гистограмм

Классическая гистограмма характеризует числа попаданий значений элементов вектора Y в М интервалов с представлением этих чисел в виде столбцовой диаграммы. Для получения данных для гистограммы служит функция hist, записываемая в следующем виде:

Команда hist(...) с синтаксисом, аналогичным приведенному выше, строит график гистограммы. В следующем примере строится гистограмма для 1000 случайных чисел и выводится вектор с данными о числах их попаданий в интервалы, заданные вектором х:

» х=-3:0.2:3; 

» y=randn(1000,1); 

» hist(y,x)

 » h=hist(y,x) 

h =

Columns 1 through 12

0 0 3 7 8 9 11 23 33 43 57 55

Columns 13 through 24

70 62 83 87 93 68 70 65 41 35 27 21

Columns 25 through 31

12 5 6 3 2 1 0

Построенная гистограмма показана на рис. 6.8.

Рис. 6.8. Пример построения гистограммы

Нетрудно заметить, что распределение случайных чисел близко к нормальному закону. Увеличив их количество, можно наблюдать еще большее соответствие этому закону.

Лестничные графики — команды stairs

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

Для построения лестничных графиков в системе MATLAB используются команды группы stairs:

Следующий пример иллюстрирует построение лестничного графика:

» х=0:0.25:10; 

» stairs(x,x.^2);

Результат построения представлен на рис. 6.9.

Рис. 6.9. Лестничный график функции х^2

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

Функция H=stairs(X,Y) возвращает вектор дескрипторов графических объектов.

Функция

[XX,YY]=stairs(X,Y)

сама по себе график не строит, а возвращает векторы XX и YY, которые позволяют построить график с помощью команды plot(XX,YY).

Графики с зонами погрешности

Если данные для построения функции определены с заметной погрешностью, то используют графики функций типа errorbar с оценкой погрешности каждой точки путем ее представления в виде буквы I, высота которой соответствует заданной погрешности представления точки. Команда errorbar используется в следующем виде:

Следующий пример иллюстрирует применение команды errorbar:

» х=-2:0.1:2;

» y=erf(x);

» е=rand(size(x))/10;

» errorbar(x,y,e);

Построенный график показан на рис. 6.10.

Рис. 6.10. График функции erf(x) с зонами погрешности

Функция, записываемая в виде H=errorbar(...), возвращает вектор дескрипторов графических объектов.

График дискретных отсчетов функции

Еще один вид графика функции у(х) — ее представление дискретными отсчетами. Этот вид графика применяется, например, при описании квантования сигналов. Каждый отсчет представляется вертикальной чертой, увенчанной кружком, причем высота черты соответствует y-координате точки.

Рис. 6.11. График дискретных отсчетов функции

Для построения графика подобного вида используются команды stem(...):

» х = 0:0.1:4;

» у = sin(x.^2).*exp(-x);

» stem(x.y)

Полученный для данного примера график показан на рис. 6.11.

Функция H=STEM(...) строит график и возвращает вектор дескрипторов графических объектов.

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

В полярной системе координат любая точка представляется как конец радиус-вектора, исходящего из начала системы координат, имеющего длину RHO и угол ТНЕТА. Для построения графика функции RHO(THETA) используются приведенные ниже команды. Угол ТНЕТА обычно меняется от 0 до 2*pi. Для построения графиков функций в полярной системе координат используются команды типа polar(...):

Рис. 6.12 демонстрирует результат выполнения команд:

» t=0:pi/50:2*pi; 

» polar(t,sin(5*t))

Рис. 6.12. График функции в полярной системе координат

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

Угловые гистограммы

Угловые гистограммы находят применение в индикаторах радиолокационных станций, для отображения «роз» ветров и при построении других специальных графиков. Для этого используется ряд команд типа rose(...):

Следующий пример иллюстрирует применение команды rose:

» rose(1:100,12)

На рис. 6.13 показан пример построения графика командой rose.

Рис. 6.13. Угловая гистограмма

Функция H=rose(...) строит график и возвращает вектор дескрипторов графических объектов, а функция [T,R]=rose(...) сама по себе график не строит, но возвращает векторы Т и R, которые нужны команде polar (Т, R) для построения подобной гистограммы.

Графики векторов

Иногда желательно представление ряда радиус-векторов в их обычном виде, то есть в виде стрелок, исходящих из начала координат и имеющих угол и длину, определяемые действительной и мнимой частью комплексных чисел, представляющих эти векторы. Для этого служит группа команд compass:

В следующем примере показано использование команды compass:

» Z=[-1+2i,-2-3i,2+3i,5+2i]; 

» compass(Z)

Построенный в этом примере график представлен на рис. 6.14.

Рис. 6.14. Построение радиус-векторов

Функция H=COMPASS(...) строит график и возвращает дескрипторы графических объектов.

График проекций векторов на плоскость

Иногда полезно отображать комплексные величины вида z = х + yi в виде проекции радиус-вектора на плоскость. Для этого используется семейство графических команд класса feather:

Пример применения команды feather:

» x=0:0.1*pi:3*pi; 

» y=0.05+i; 

» z=exp(x*y); 

» feather(z)

График, построенный в этом последнем примере, показан на рис. 6.15.

Рис. 6.15. График, построенный функцией feather

Функция Н=РЕАТНЕR(...)строит график и возвращает вектор дескрипторов графических объектов.

Контурные графики

Контурные графики служат для представления на плоскости функции двух переменных вида z(x, у) с помощью линий равного уровня. Они получаются, если трехмерная поверхность пересекается рядом плоскостей, расположенных параллельно друг другу. При этом контурный график представляет собой совокупность спроецированных на плоскость (х, у) линий пересечения поверхности г(х, у) плоскостями.

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

Пример построения контурного графика поверхности, заданной функций peaks:

» z=peaks(27); 

» contour(z,15)

Построенный в этом примере график показан на рис. 6,16. Заметим, что объект — функция peaks — задан в MATLAB в готовом виде.

Рис. 6.16. Контурный график, построенный с помощью команды contour

Графики этого типа часто используются в топографии для представления на листе бумаги (как говорят математики — на плоскости) объемного рельефа местности. Для оценки высот контурных линий используется их функциональная окраска.

Создание массивов данных для трехмерной графики

Трехмерные поверхности обычно описываются функцией двух переменных z(x, у). Специфика построения трехмерных графиков требует не просто задания ряда значений х и у, то есть векторов х и у. Она требует определения для X и Y двумерных массивов — матриц. Для создания таких массивов служит функция meshgrid. В основном она используется совместно с функциями построения графиков трехмерных поверхностей. Функция meshgrid записывается в следующих формах:

Пример:

» [X, Y] = meshgnd(l:4,13:17) 

X =

1

2

3

4

1

2

3

4

1

2

3

4

1

2

3

4

1

2

3

4

Y=




13

13

13

13

14

14

14

14

15

15

15

15

16

16

16

16

17

17

17

17

Приведем еще один пример применения функции meshgrid: 

» [X, Y] = meshgrid(-2:.2:2, -2:.2:2);

Такой вызов функции позволяет задать опорную плоскость для построения трехмерной поверхности при изменении аргумента от -2 до 2 с шагом 0.2. Дополнительные примеры применения функции meshgrid будут приведены далее при описании соответствующих команд. Рекомендуется ознакомиться с также командами surf и slice (ломтик).

Функция ndgrid является многомерным аналогом функции meshgrid:

» [X1, X2] = ndgrid(-2:.2:2, -2:.2:2);
» Z = X1 .* exp(-X1.^2 - X2.^2);
» mesh(Z)

Рекомендуем читателю опробовать действие этого примера.

Графики поля градиентов quiver

Для построения графиков полей градиента служат команды quiver:

» х = -2:.2:2: у = -1:.2:1;

» [хх.уу] = meshgrid(x.y); 

» zz = хх.*ехр(-хх.х2-уу.~2); 

» [рх.ру] = gradient(zz..2..2); 

» quiver(x.y.px.py,2);

Построенный в этом примере график показан на рис. 6.17.

Рис. 6.17. Пример построения графика поля градиентов

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

Построение графиков поверхностей

Команда plot3(...) является аналогом команды plot (...), но относится к функции двух переменных z(x, у). Она строит аксонометрическое изображение трехмерных поверхностей и представлена следующими формами:

Ниже дан пример построения трехмерной поверхности, описываемой функцией 

z(х.у)=х^2+у^2;

» [X.Y]=meshgrid([-3:0.15:3]);

» Z=X.A2+Y.*2;

» plot3(X.Y.Z)

График этой поверхности показан на рис. 6.18.

Рис. 6.18. График поверхности, построенный линиями

» [X.Y]-meshgrid([-3:0.15:3]): 

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

» plot3(X.Y,Z.'o')

График поверхности, построенный кружками, показан на рис. 6.19.

Рис. 6.19. График поверхности, построенный разноцветными кружками

Пример применения последней команды дан ниже:

» [X.Y]=meshgrid([-3:0.15:3]);

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

» plot3(X.Y.Z.'-k'.Y.X.Z.'-k')

График функции, соответствующей последнему примеру, представлен на рис. 6.20.

Рис. 6.20. График функции в сетчатом представлении

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

Сетчатые 3D-графики с окраской

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

Возможны также формы команды mesh(x,y.Z), mesh(x.y.Z,C), mesh(Z) и mesh(Z.C).

Функция mesh возвращает дескриптор для объекта класса surface. Ниже приводится пример применения команды mesh:

» [X.Y]=meshgrid([-3:0.15:3]);

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

» mesh(X.Y.Z)

На рис. 6.21 показан график поверхности, созданной командой mesh(X.Y.Z). Нетрудно заметить, что функциональная окраска линий поверхности заметно усиливает наглядность ее представления.

Рис. 6.21. График поверхности, созданный командой mesh(X,Y,Z)

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

» z=peaks(25); 

» mesh(z);

График поверхности, описываемой функцией peaks, представлен на рис. 6.22.

Рис. 6.22. График поверхности, описываемой функцией peaks

Рекомендуется ознакомиться с командами и функциями, используемыми совместно с описанными командами: axis, caxis, colormap, hold, shading и view.

Сетчатые 3D-графики с проекциями

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

Для этого используется команда meshc:

Ниже дан пример применения этой команды:

» [X.Y]=meshgrid([-3:0.15:3]); 

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

» meshc(X.Y.Z)

Построенный график показан на рис. 6.23.

Рис. 6.23. График поверхности и ее проекции на расположенную ниже плоскость

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

Построение поверхности столбцами

Еще один тип представления поверхности, когда она строится из многочисленных столбцов, дают команды класса meshz:

» [X.Y]=meshgrid([-3:0.15:3]); 

» Z=X."2+Y.*2; 

» meshz(X.Y.Z)

Столбцовый график поверхности показан на рис. 6.24.

Графики такого типа используются довольно редко. Возможно, он полезен архитекторам или скульпторам, поскольку дает неплохое объемное представление о поверхностях.

Рис. 6.24. Построение поверхности столбцами

Построение поверхности с окраской

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

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

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

» [X.Y]=meshgrid([-3:0.15:3]); 

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

» Surf(X.Y.Z)

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

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

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

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

» [X,Y]=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. График поверхности с функциональной окраской серым цветом

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

Построение поверхности и ее проекции

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

Пример применения команды surf с приводится ниже:

» [X.Y]=meshgrid([-3:0.1:3]); 

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

» surfc(X.Y.Z)

На рис. 6.27 показаны графики, построенные в данном примере.

Рис. 6.27. График поверхности и ее проекции на опорную плоскость

Рассмотрим еще один пример применения команды surf с, на этот раз для построения поверхности, описываемой функцией peaks, с применением интерполяции цветов и построением цветовой шкалы:

» [X.Y]=meshgrid([-3:0.1:3]); 

» Z=peaks(X,Y;

» surfc(X.Y.Z) 

» shading interp 

» colorbar

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

Рис. 6.28. График функции peaks с проекцией и шкалой цветов

Построение освещенной поверхности

Пожалуй, наиболее реалистичный вид имеют графики поверхностей, в которых имитируется освещение от точечного источника света, расположенного в заданном месте координатной системы. Графики имитируют оптические эффекты рассеивания, отражения и зеркального отражения света. Для получения таких графиков используется команда surf 1:

По умолчанию вектор S задает углы азимута и возвышения в 45°. Используя команды cla, hold on, view(AZ,EL), surfl (...) и hold off, можно получить дополнительные возможности управления освещением. Надо полагаться на упорядочение точек в X, Y, и Z матрицах, чтобы определить внутреннюю и внешнюю стороны параметрических поверхностей. Попробуйте транспонировать матрицы и использовать surfHX' .Y' ,Z'), если вам не понравился результат работы этой команды. Для вычисления векторов нормалей поверхности surf1 требует в качестве аргументов матрицы с размером по крайней мере 3x3.

Ниже представлен пример применения команды surfl:

» [X.Y]=meshgrid([-3:0.1:3]); 

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

» surfl(X.Y.Z) 

» colormap(gray) 

» shading interp 

» colorbar

Построенная в этом примере поверхность представлена на рис. 6.29.

Рис. 6.29. График поверхности с имитацией ее освещения точечным источником

Сравните этот рисунок с рис. 6.26, на котором та же поверхность построена без имитации ее освещения.

 Нетрудно заметить определенную логику в названиях графических команд. Имя команды состоит из основного слова и суффикса расширения. Например, все команды построения поверхностей имеют основное слово surf (сокращение от surface — поверхность) и суффиксы: с — для контурных линий поверхности, l — для освещенности и т. д. Это правило облегчает запоминание многочисленных команд графики.

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

Рекомендуется с помощью команды help ознакомиться с командами, задающими управление подсветкой и связанными с ней оптическими эффектами:

Следующие три команды позволяют управлять углами просмотра, под которыми рассматривается видимая в графическом окне фигура:

В ряде случаев применением этих команд можно добиться большей выразительности трехмерных объектов. Скорость построения таких графиков сильно зависит от аппаратной поддержки графики в конкретном ПК. Так, использование современных видеоадаптеров с графическим процессором и поддержкой средств OpenGL позволяет повысить скорость построения трехмерных графиков в несколько раз и добиться большей их выразительности.

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

Графики сечений функций трех переменных строит команда slice (в переводе — «ломтик»). Она используется в следующих формах:

График примера, приведенного ниже, представлен на рис. 6.30.

» [x.y.z]= meshgrid(-2:.2:2. -2:.25:2. -2:.16:2); 

» v = sin(x) .* ехр(-х.*2 - у.^2 - z.^2); 

» slice(x.y.z.v.[-1.2 .8 2].2.[-2 -.2])

График трехмерной слоеной поверхности

Иногда бывают полезны графики трехмерных слоеных поверхностей, как бы состоящие из тонких пластинок — слоев. Такие поверхности строит функция water-fall (водопад):

Рассмотрим пример применения команды waterfall:

» [X.Y]=meshgrid([-3:0.1:3]); 

» Z=sin(X)./(X.*2+Y.*2+0.3); 

» waterfall(X.Y.Z) 

» colormap(gray) 

» shading interp

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

Рис. 6.30. Трехмерная слоеная поверхность

Tрехмерные контурные графики

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

При этом в отличие от двумерного контурного графика линии равного уровня отображаются в аксонометрии. Для получения трехмерных контурных графиков используется команда contourS:

Полезные частные формы записи этой команды:

Пример применения команды contourS:

» contour3(peaks,20) 

» colormap(gray)

Соответствующий данному примеру график представлен на рис. 6.31. В данном случае задано построение двадцати линий уровня.

Рис. 6.31. Трехмерный контурный график для функции peaks

С командой contourS связаны следующие одноименные функции (не выполняющие графические построения):

Установка титульной надписи

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

Пример применения этой команды будет дан в следующем разделе.

Установка осевых надписей

Для установки надписей возле осей х, у и z используются следующие команды:

xlabe('String') 

ylabeK ('String') 

zlabelС ('String')

Соответствующая надпись задается символьной константой или переменной 'String'. Пример установки титульной надписи и надписей по осям графиков приводится ниже:

» [X.Y]=meshgrid([-3:0.1:3]);

» Z=sin(X)./(X."2+Y."2+0.3);

» surfl(X.Y.Z)

» colorbar

» colormap(gray)

» shading interp

» xlabeK'Axis X')

» ylabeK'Axis Y')

» zlabeK'Axis Z')

» titleC'Surface graphic')

Построенный в этом примере график трехмерной поверхности показан на рис. 6.32.

Рис. 6.32. График трехмерной поверхности с титульной надписью и надписями по координатным осям

Сравните его с графиком, показанным на рис. 6.29. Надписи делают рисунок более наглядным.

Ввод текста в любое место графика

Часто возникает необходимость добавления текста в определенное место графика, например для обозначения той или иной кривой графика. Для этого используется команда text:

В приведенном ниже примере надпись «График функции sin(x^3)» размещается под кривой графика в позиции (-4, 0.7):

» х=10:0.1:10;

» plot(x.sin(x).^3)

» text(-4.0.7,'Graphic sin(x)^3')

График функции с надписью у кривой показан на рис. 6.33.

Рис. 6.33. Пример ввода надписи в поле графика функции 

Математически правильной записью была бы sin3x.

Попробуйте ввести самостоятельно:

» х=-10:0.1:10;

» plot(x,sin(x).^3)

» text(-4.0.7,'Graphic (sin(х)^3)')

Функция h=text(...) возвращает вектор-столбец h дескрипторов объектов класса text, дочерних для объектов класса axes. Следующий пример вычисляет дескриптор h

» h=text(.25. .5. '\ite^{i\omega\tau} = cos(\omega\tau) + ... i sin(\omega\tau)')

3.0022 и выводит в пустом графике математическую формулу в формате ТеХ вида:

ejwt = cos(wt) + sin(wt)

Пары координат X,Y (или тройки X,Y,Z для трехмерных графиков) могут сопровождаться парами «имя параметра/значение параметра» для задания дополнительных свойств текста. Пары координат X,Y (или тройки X,Y,Z для трехмерных графиков) могут быть полностью опущены, при этом все свойства, в том числе и позиция текста, задаются с помощью пар «имя параметра/значение параметра», заданных по умолчанию.

Используйте функцию get(H), где Н — дескриптор графического объекта (в нашем случае графического объекта класса text), чтобы просмотреть список свойств объекта и их текущие значения. Используйте set(H), чтобы просмотреть список свойств графических объектов и их допустимых значений.

Позиционирование текста с помощью мыши

Очень удобный способ ввода текста предоставляет команда gtext:

Пример применения команды gtext:

» х=-15:0.1:15;

» plot(x. sin(x).^3)

» gtext('Function sin(x)*3')

При исполнении этого примера вначале можно увидеть построение графика функции с большим крестом, перемещаемым мышью (рис. 6.34).

Установив перекрестие в нужное место графика, достаточно нажать любую клавишу или любую кнопку мыши, и на этом месте появится надпись (рис. 6.35).

Рис. 6.34. График функции с крестообразным маркером, перемещаемым мышью

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

Рис. 6.35. График функции с надписью, установленной с помощью мыши

Вывод пояснений

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

Чтобы перенести легенду, установите на нее курсор, нажмите левую кнопку мыши и перетащите легенду в необходимую позицию.

Команда 1 egend может использоваться с двумерной и трехмерной графикой и со специальной графикой — столбцовыми и круговыми диаграммами и т. д. Двойным щелчком можно вывести легенду на редактирование.

Пример, приведенный ниже, строит график трех функций с легендой, размещенной в поле графика:

» x=-2*pi:0.1*pi :2*pi; 

» yl=sin(x); 

» y2=sin(x).^2;

» p1ot(x,yl. '-m' ,x.y2. '-.+r' .х.уЗ. '--ok')

» legend( 'Function 1'. 'Function 2'. 'Function 3');

Полученный график представлен на рис. 6.36.

Рис. 6.36. График трех функций с легендой в поле графика

Незначительная модификация команды legend (применение дополнительного параметра -1) позволяет построить график трех функций с легендой вне поля графика:

» x=-2*pi:0.l*pi:2*pi;

» yl=sin(x);

» y2=sin(x).^2;

» y3=sin(x).^3;

» plotCx.yl.'-m',x.y2.'-.+r',x.y3,'--ok')

» legendC Function Г,'Function 2','Function 3'.-l);

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

Рис. 6.37. График трех функций с легендой, расположенной вне поля графика

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

Маркировка линий уровня на контурных графиках

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

Пример применения команды clabel приводится ниже:

» [X,Y]=meshgrid([-3:0.1:3]); 

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

» C=contour(X.Y.Z.10); 

» colormap(gray) 

» clabel(С)

Рис. 6.38. Контурный график с маркированными линиями уровня

Рис. 6.38 показывает построение контурного графика с маркированными линиями уровня.

Функция H=cl abel (...) маркирует график и возвращает дескрипторы создаваемых при маркировке объектов класса TEXT (и, возможно, LINE).

Управление свойствами осей графиков

Обычно графики выводятся в режиме автоматического масштабирования. Следующие команды класса axis меняют эту ситуацию:

Следующий пример иллюстрирует применение команды axis при построении двумерного графика функции одной переменной:

» х=5:0.1:5;

» plot(x,sin(x));

» axis([-10 10 -1.5 1.5])

На рис. 6.40 показан график, который строится в этом примере.

Рис. 6.39. Пример задания масштаба осей двумерного графика

Обратите внимание, что теперь масштабы осей заданы командой axis, а не диапазоном изменения значений х и у.

Включение и выключение сетки

В математической, физической и иной литературе при построении графиков в дополнение к разметке осей часто используют масштабную сетку. Команды grid позволяют задавать построение сетки или отменять это построение:

Рис. 6.40. График синусоиды с сеткой разметки

Команды grid устанавливают свойства объектов XGrid, Ygrid и Zgrid для текущих осей. Ниже приведен пример из предшествующего раздела с добавлением в него команды grid:

» х=-5:0.1:5;

» plot(x,sin(x));

» axis([-10 10 -1.5 1.5])

» grid on

Построенный график показан на рис. 6.40.

Сравните этот график с графиком на рис. 6.39, на котором сетка отсутствует. Нетрудно заметить, что наличие сетки облегчает количественную оценку координат точек графика.

Наложение графиков друг на друга

Во многих случаях желательно построение многих наложенных друг на друга графиков в одном и том же окне. Для этого служит команда продолжения графических построений hold. Она используется в следующих формах:

Команда hold on устанавливает значение add для свойства NextPlot объектов figure и axes, a hold off устанавливает для этого свойства значение replace. Рекомендуется также ознакомиться с командами ishold, newplot, figure и axes.

Рис. 6.41. Графики синусоиды и трех параметрических функций в одном окне

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

» х--5:0.1:5; 

» plotCx.sin(x))

» hold on

» plot(sin(x).cos(x))

» plot(2*sin(x).cos(x))

» plot(4*sin(x).cos(x)) 

» hold off

Графики построенных функций показаны на рис. 6.42.

В конце приведенного фрагмента программы команда hold off отключает режим добавления графиков к ранее построенным графикам.

Разбиение графического окна

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

Рис. 6.42. Четыре графика различного типа, размещенных в подокнах одного окна

Следующий пример иллюстрирует применение команды subplot:

» х=-5:0.1:5; 

subplot(2.2.1).plot(x.sin(x))

subplot(2.2.2).plot(sin(5*x).cos(2*x+0.2))

subplot(2.2.3).contour(peaks)

subplot(2.2.4).surf(peaks)

В этом примере последовательно строятся четыре графика различного типа, размещаемых в разных подокнах (рис. 6.42).

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

Изменение масштаба графика

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

Команда zoom позволяет управлять масштабированием графика с помощью мыши. Для этого надо подвести курсор мыши к интересующей вас области рисунка. Если команда zoom включена (on), то нажатие левой кнопки увеличивает масштаб вдвое, а правой — уменьшает вдвое. При нажатой левой кнопке мыши можно выделить пунктирным черным прямоугольником нужный участок графика — при отпускании кнопки он появится в увеличенном виде и в том масштабе, который соответствует выделяющему прямоугольнику.

Рассмотрим работу команды zoom на следующем примере:

» х=-5:0.01:5;

» plot(x.sin(x.^5)./(x.^5+eps))

» zoom on

Рис. 6.44 показывает график функции данного примера в режиме выделения его участка с помощью мыши.

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

Рис. 6.43. Выделение части графика мышью при использовании команды zoom

Команда zoom, таким образом, выполняет функцию «лупы», позволяющей наблюдать в увеличенном виде отдельные фрагменты сложных графиков. Однако следует учитывать, что для наблюдения фрагментов графиков при высоком увеличении они должны быть заданы большим количеством точек. Иначе вид отдельных фрагментов и тем более особых точек (в нашем случае это точка при х вблизи нуля) будет существенно отличаться от истинного.

Рис. 6.44. График выделенного участка

Установка палитры цветов

Поскольку графика MATLAB обеспечивает получение цветных изображений, в ней есть ряд команд для управления цветом и различными световыми эффектами. Среди них важное место занимает установка палитры цветов. Палитра цветов RGB задается матрицей MAP из трех столбцов, определяющих значения интенсивности красного (red), зеленого (green) и синего (blue) цветов. Их интенсивность задается в относительных единицах от 0.0 до 1.0. Например, [0 0 0] задает черный цвет, [1 1 1] — белый цвет, [0 0 1] — синий цвет. При изменении интенсивности цветов в указанных пределах возможно задание любого цвета. Таким образом, цвет соответствует общепринятому формату RGB.

Для установки палитры цветов служит команда colormap, записываемая в следующих формах:

Команда help graphSd наряду с прочим выводит полный список характерных палитр, используемых графической системой MATLAB:

Все эти палитры могут служить параметрами команды colormap, например colormap(hsv) фактически устанавливает то же, что и команда colormap( 'default'). Примеры применения команды colormap будут приведены в следующих разделах.

Установка соответствия между палитрой цветов и масштабом осей

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

Функция caxis возвращает двухэлементный вектор с элементами [cmin cmax] для текущего светового эффекта, m-файл с именем caxi s задает свойства dim и CLimMode объекта axes (см. команду help axes).

Окраска поверхностей

Для окраски поверхностей используется команда shading, которая управляет объектами surface (поверхность) и patch (заплата), создаваемыми командами и функциями surf, mesh, pcolor, fill и fill 3. Команда shading (затенение) работает с параметрами и имеет следующий вид:

Эти команды устанавливают свойства EdgeColor и FaceColor для графических объектов surface и patch в зависимости от того, какая из команд — mesh (сетчатая поверхность) или surf (затененная поверхность) — используется. Примеры применения команд shading уже приводились.

Установка палитры псевдоцветов

Довольно часто возникает необходимость представления той или иной матрицы в цветах. Для этого используют псевдоцвета, зависящие от содержимого ячеек. Такое представление реализуют команды класса pcolor:

Рис. 6.45. Пример применения команды pcolor

Функция pcolor возвращает дескриптор объекта класса surface. Пример применения команды pcolor приводится ниже:

» z=peaks(40);

» colormap(hsv)

» pcolor(z)

График, построенный в этом примере, показан на рис. 6.45.

Характер расцветки поверхности командой pcolor существенно зависит от выбора палитры цветов. В приведенном примере она задается командой colormap.

Создание закрашенного многоугольника

Для создания закрашенного пятна в виде многоугольника может использоваться команда patch:

Следующий пример поясняет применение команды patch:

» Х=[1 2 3 2 1];

» Y=[l 2 0 5 1];

» patch(X.Y.[l 0 0])

Построенный многоугольник показан на рис. 6.46.

В данном случае многоугольник окрашен красным цветом, поскольку вектор цветов [1 0 0] указывает на наличие только красной составляющей цвета (другие составляющие представлены относительным уровнем 0).

Рис. 6.46. Многоугольник, построенный командой patch

Окраска плоских многоугольников

Для построения окрашенных в заданный цвет плоских многоугольников может использоваться команда fill (заполнить):

Следующий пример показывает построение четырехугольника, закрашенного синим цветом:

» Х=[1 2321];

» Y=[5 0.5 0 4 5]:

» filKX.Y.[0 0 1])

Построения, реализованные этим примером, показаны на рис. 6.47.

Рис. 6.47. Построение закрашенного четырехугольника на плоскости

Функция H=f 1П (...) строит график и возвращает вектор-столбец дескрипторов для созданных объектов класса patch по одному дескриптору на каждый объект.

Вывод шкалы цветов

При использовании функциональной окраски весьма полезным является вывод шкалы цветов командой colorbar. Ее варианты перечислены ниже:

Следующий пример показывает применение команды colorbar совместно с командой fill3:

» fill3(rand(5.4).rand(5.4).rand(5.4),rand(5.4)) 

» colorbar('vert')

Более подробно функция f ill3 будет рассмотрена ниже. На рис. 6.48 показана полученная при запуске этого примера картина. Следует отметить, что, поскольку многоугольники строятся со случайными значениями координат вершин, то при каждом запуске будет наблюдаться новая картина.

Рис. 6.48. Случайные многоугольники с функциональной окраской и вертикальной шкалой цветов 

Функция H=col orbar(...) возвращает дескриптор для объекта axes со шкалой цветов.

Цветные плоские круговые диаграммы

Закрашенные секторы часто используются для построения круговых диаграмм. Для этого в MATLAB служит команда piе:

Следующий пример строит цветную круговую диаграмму с пятью секторами, причем последний сектор отделен от остальных:

» Х=[1 2 3 4 5];

» pie(X.[0 0 0 0 2])

Построенная диаграмма показана на рис. 6.49.

Рис. 6.49. Плоская круговая диаграмма

Функция Н=рiе(...) строит график и возвращает вектор дескрипторов созданных объектов классов patch и text.

Другие команды управления световыми эффектами

Здесь мы только отметим некоторые дополнительные команды, связанные с управлением цветовыми палитрами:

Рекомендуется ознакомиться с этими командами, используя команду help.

Окрашенные многоугольники в пространстве

Для закраски многоугольников, определенных в пространстве, служит команда f ill3. Ниже представлены основные ее формы:

Следующий пример показывает действие команды fill3: 

» fill3(rand(5,4),rand(5,4).rand(5.4).rand(5.4))

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

Рис. 6.50. Закрашенные многоугольники в пространстве

Следует обратить внимание на то, что команда pie3 дает функциональную закраску построенных фигур.

Цветные объемные круговые диаграммы

Иногда используются объемные круговые диаграммы. Для их построения служит команда pie3:

В приведенном ниже примере строится объемная диаграмма с отделением двух секторов, показанная на рис. 6.51:

» Х=[1 2345];

» pie3(X,[0 0 1 01])

Рис. 6.51. Объемная круговая диаграмма

Функция H=pie3(...) строит график и возвращает вектор, содержащий дескрипторы созданных объектов классов patch, surface и text.

Построение цилиндра

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

cylinder:

Пример построения объемного цилиндра:

» [X.Y.Z]=cyl1nder(10.30); 

» surf(X.Y.Z.X)

На рис. 6.52 показан результат построения цилиндра для данного примера.

Рис. 6.52. Построение цилиндра

Естественность воспроизведения цилиндра существенно зависит от графической команды, используемой для его построения. Команда surf дает возможность задать функциональную окраску с цветом, определяемым вектором X, что делает представление цилиндра достаточно наглядным.

Построение сферы

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

Пример применения этой функции:

» [X,Y,Z]=sphere(30); 

» surfl(X.Y.Z)

На рис. 6.53 показана построенная в этом примере сфера. Хорошо видны геометрические искажения (сфера приплюснута), связанные с разными масштабами по координатным осям.

Рис. 6.53. Построение сферы

Обратите внимание на то, что именно функциональная окраска сферы придает ей довольно реалистичный вид. В данном случае цвет задается вектором Z.

Трехмерная графика с треугольными плоскостями

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

Рис. 6.54. Одна из объемных фигур, построенных командой trimesh

Следующий пример иллюстрирует применение команды trimesh для построения случайной объемной фигуры, параметры которой задаются с помощью генератора случайных чисел:

» х = rand(1.40): 

» у = rand(1.40): 

» z = sin(x.*y); 

» tri = delaunay(x.y); 

» tnmesh(tri .x.y.z)

Рис. 6.55. Один из рисунков, построенных командой trisurf

Одна из построенных фигур показана на рис. 6.54. Другая, абсолютно аналогичная, по заданию входных параметров команда — tnsurf(...) — отличается только закраской треугольных областей, задающих трехмерную фигуру. Если в приведенном выше примере заменить функцию trimesh на trisurf, то можно получить графики, подобные приведенному на рис. 6.55.

Обратите внимание на то, что рис. 6.55 также принадлежит к множеству случайных графических построений. Поэтому возможность его буквального повторения отсутствует.

Что нового мы узнали?

В этом уроке мы научились: