Самоучитель по Matlab

         

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


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

pie(X) — строит круговую диаграмму по данным нормализованного вектора X/ SUM(X). SUM(X)—сумма элементов вектора. Если SUM(X)<=1.0, то значения в X непосредственно определяют площадь секторов;

pie(X.EXPLODE) — строит круговую диаграмму, у которой отрыв секторов от центра задается вектором EXPLODE, который должен иметь тот же размер, что и вектор данных X.

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

» Х=[1 2 3 4 5];

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

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

Рис. 6.49.

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

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



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


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

col style — выделение цвета и стиля графика из заданного массива;

rgbplot — изображение палитры;

hsv2rgb — преобразование палитры HSV в палитру RGB;



rgb2hsv — преобразование палитры RGB в палитру HSV;

brighten — управление яркостью;

contrast — управление контрастом;

hidden — управление показом невидимых линий;

whitebg — управление цветом фона.

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



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


Еще один вид графика функции

у(х) —

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

Рис. 6.11.

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

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

stem(X.Y) — строит график отсчетов с ординатами в векторе Y и абсциссами в векторе X;

stem(.... 'LINESPEC') — дает построения, аналогичные ранее приведенным командам, но со спецификацией линий 'LINESPEC', подобной спецификации, приведенной для функции plot;

stem(Y) — строит график функции с ординатами в векторе Y в виде отсчетов;

stem(.... 'filled') — строит график функции с закрашенными маркерами. Следующий пример иллюстрирует применение команды stem:

» х = 0:0.1:4;

» у = sin(x.

^

2).*exp(-x):

» stem(x.y)

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

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

объектов.



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


Иногда полезно отображать комплексные величины вида z =

х + yi

в виде проекции радиус-вектора на плоскость. Для этого используется семейство графических команд класса feather:

feather(U.V) — строит график проекции векторов, заданных компонентами U и V, на плоскость;

feather (Z) — для вектора Z с комплексными элементами дает построения, аналогичные feather(REAL(Z),IMAG(Z));

feather(..., S) — дает построения, описанные выше, но со спецификацией линий, заданной строковой константой S по аналогии с командой plot.

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

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

»y=0.05+i; 

» z=exp(x*y); 

» feather(z)

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

Рис. 6.15.

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

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



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


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

waterfal(...) — строит поверхность, как команда mesh(...), но без показа ребер сетки. При ориентации графика относительно столбцов следует использовать запись waterfall(Z

1

) или waterfall (X

'

,Y' ,Z').

Рассмотрим пример применения команды 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.

Трехмерная слоеная поверхность



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


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

quiver(X.Y.U.V) — строит график поля градиентов в виде стрелок для каждой пары элементов массивов X и Y, причем элементы массивов U и V указывают направление и размер стрелок;

qui ver(U, V) — строит векторы скорости в равнорасположенных точках на плоскости

(х, у);

quiver(U,V,S) или quiver(X,Y.U,V,S) — автоматически масштабирует стрелки по сетке и затем вытягивает их по значению S. Используйте S=0, чтобы построить стрелки без автоматического масштабирования;

quiver(...,LINESPEC) — использует для векторов указанный тип линии. Указанные в LINESPEC маркеры рисуются у оснований, а не на концах векторов. Для отмены любого вида маркера используйте спецификацию '.'. Спецификации линий, цветов и маркеров были подробно описаны в разделе, посвященном команде plot;

quiver(.... 'filled') — дает график с закрашенными маркерами; 

H=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.

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

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



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


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

errorbar(X,Y,L.U) — строит график значений элементов вектора Y в зависимости от данных, содержащихся в векторе X, с указанием нижней и верхней границ значений, заданных в векторах L и U;

errorbar(X,Y,E) Herrorbar(Y.E) —строит графики функции Y(X) с указанием этих границ в виде [Y-E Y+E], где Е — погрешность;

errorbar(..., 'LineSpec') — аналогична описанным выше командам, но позволяет строить линии со спецификацией 'LineSpec', аналогичной спецификации, примененной в команде plot.

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

» х=2:0.1:2:

» y=erf(x):

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

» errorbar(x.y.e)

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

Рис. 6.10.

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

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



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


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

х

и

у,

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

 loglogx(...) — синтаксис команды аналогичен ранее рассмотренному для функции plot(...). Логарифмический масштаб используется для координатных осей

X

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

» x=logspace(-1,3); 

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

» grid on

На рис. 6.4 представлен график функции

ехр(х)/х

в логарифмическом масштабе. Обратите внимание на то, что командой grid on строится координатная сетка.

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

Рис. 6.4.

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



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


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

polarCTHETA, RHO) — строит график в полярной системе координат, представляющий собой положение конца радиус-вектора с длиной RHO и углом ТНЕТА;

polarCTHETA,RHO.S) — аналогична предыдущей команде, но позволяет задавать стиль построения с помощью строковой константы S по аналогии с командой plot.

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

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

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

Рис. 6.12.

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

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



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


В некоторых случаях предпочтителен

полулогарифмический

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

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

 semilogx(...) — строит график функции в логарифмическом масштабе (основание 10) по оси

X

и линейном по оси

Y;

semilоgу (...) — строит график функции в логарифмическом масштабе по оси

Y

и линейном по оси

X.

Рис. 6.5.

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

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

» х=0:0.5:10;

» semilogy(x.exp(x))

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

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



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


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

compass(U.V) — строит графики радиус-векторов с компонентами (U.V), представляющими действительную и мнимую части каждого из радиус-векторов;

compass (Z) — эквивалентно compass (real (Z), imag(Z));

compass(U.V,LINESPEC) и Compass(Z.LINESPEC)

аналогичны представленным выше

командам, но позволяют задавать спецификацию линий построения LINESPEC,

подобную описанной для команды plot.

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

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

» compass(Z)

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

Рис. 6.14.

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

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



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


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

zoom — переключает состояние режима интерактивного изменения масштаба для текущего графика;

zoom (FACTOR) устанавливает масштаб в соответствии с коэффициентом FACTOR;

zoom on — включает режим интерактивного изменения масштаба для текущего графика;

zoom off — выключает режим интерактивного изменения масштаба для текущего графика;

zoom out — обеспечивает полный просмотр, т. е. устанавливает стандартный масштаб графика;

zoom xon или zoom yon — включает режим изменения масштаба только по оси

х

или по оси

у;

zoom reset — запоминает текущий масштаб в качестве масштаба по умолчанию для данного графика;

zoom(FIG,OPTION) — применяется к графику, заданному дескриптором FIG, при этом OPTION может быть любым из перечисленных выше аргументов.

Команда 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.

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



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


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

z(x, у) с

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

(х, у)

линий пересечения поверхности

г(х, у)

плоскостями.

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

contour(Z) — строит контурный график по данным матрицы Z с автоматическим заданием диапазонов изменения

х

и

у;

contour(X.Y.Z) — строит контурный график по данным матрицы Z с указанием спецификаций для X и Y;О contour(Z.N) и contour(X.Y.Z.N) — дает построения, аналогичные ранее описанным командам, с заданием N линий равного уровня (по умолчанию N=10);

contour(Z, V) и contour(X,Y,Z,V) — строят линии равного уровня для высот, указанных значениями элементов вектора V;

contour(Z,[v v]) или contour(X.Y,Z.[v v]) — вычисляет одиночный контур для уровня v;

 [С.Н] = contour (...) — возвращает дескрипторы — матрицу С и вектор-столбец Н. Они могут использоваться как входные параметры для команды clabel;

contourC... 'LINESPEC') — позволяет использовать перечисленные выше команды с указанием спецификации линий, которыми идет построение.

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

» z=peaks(27); 

» contour(z,15)

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

Рис. 6.16.

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

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



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


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

у(х).

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

у(х),

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

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

stairs(Y) — строит лестничный график по данным вектора Y;

stairs(X.Y) — строит лестничный график по данным вектора Y с координатами

х

переходов от ступеньки к ступеньке, заданными значениями элементов вектора X;

stairs(...,S) — аналогична по действию вышеописанным командам, но строит график линиями, стиль которых задается строками S.

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

» х=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).



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


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

clabel(CS.H) — маркирует контурный график с данными в контурной матрице CS и дескрипторами объектов, заданными в массиве Н. Метки вставляются в разрывы контурных линий и ориентируются в соответствии с направлением линий;

clabel (CS.H, V) — маркируются только те уровни, которые указаны в векторе V. По умолчанию маркируются все контуры. Позиции меток располагаются случайным образом;

clabel (CS.H, 'manual') — маркирует контурные графики с установкой положения маркеров с помощью мыши. Нажатие клавиши Enter или кнопки мыши завершает установку маркера. При отсутствии мыши для перехода от одной линии уровня к другой используется клавиша пробела, а для перемещения надписи используются клавиши перемещения курсора;

clabel (CS), clabel (CS.V) и clabel (CS. 'manual') — дополнительные возможности маркировки контурных графиков. При отсутствии аргумента h метки не ориентируются вдоль линий контуров; точную позицию метки отмечает значок «+» (далее на рис. 6.39 показан именно этот вариант).

Пример применения команды 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).



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


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

hold on — обеспечивает продолжение вывода графиков в текущее окно, что позволяет добавлять последующие графики к уже существующим;

hold off — отменяет режим продолжения графических построений; 

hold — работает как переключатель, последовательно включая режим продолжения графических построений и отменяя его.

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

Рис. 6.41.

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

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

&

raquo; х--5:0.1:5; 

» plot(x,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 отключает режим добавления графиков к ранее построенным графикам.



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


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

fill3(X,Y,Z,C) — строит закрашенный многоугольник в пространстве с данными вершин, хранящимися в векторах X, Y и Z, и цветом, заданным палитрой С. При построении нескольких закрашенных многоугольников параметры команды должны быть матрицами;

fill3(Xl.Yl,Zl,Cl.X2,Y2,Z2,C2,...) — другой вариант построения нескольких закрашенных многоугольников в пространстве;

fill 3 — функция, возвращающая вектор-столбец дескрипторов объектов класса patch.

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

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

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

Рис. 6.50.

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

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



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


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

fill(X.Y.C) — строит закрашенный плоский многоугольник, вершины которого задаются векторами X и Y с цветом, заданным С. Многоугольник должен быть замкнутым. Для построения нескольких прямоугольников параметры команды должны быть матрицами.

fill(Xl.Yl,Cl,X2.Y2,C2,...) — представляет собой другой способ построения нескольких закрашенных прямоугольников.

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

» Х=[1 2 3 2 1];

» Y=[5 0.5 0 4 5]:

» fill(X,Y,[0 0 1])

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

Рис. 6.47.

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

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



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


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

shading flat — задает окраску ячеек или граней в зависимости от текущих данных; 

shading interp — задает окраску с билинейной интерполяцией цветов; 

shading faceted — равномерная раскраска ячеек поверхности (принята по умолчанию).

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



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


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

cylinder:

[X,Y,Z]=cylinder(R,N) — создает массивы X, Y и Z, описывающие цилиндрическую поверхность с радиусом R и числом узловых точек N для последующего построения с помощью функции surf(X.Y.Z);

[X,Y,Z]=cyl1nder(R) и [X,Y,Z]=cylinder — подобны предшествующей функции для N=20 и R=[1 1].

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

» [X,Y,Z]=cylinder(10.30); 

» surf(X,Y,Z,X)

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

Рис. 6.52.

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

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



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


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

N=hist(Y) — возвращает вектор чисел попаданий для 10 интервалов, выбираемых автоматически. Если Y — матрица, то выдается массив данных о числе попаданий для каждого из ее столбцов;

N=hist(Y,M) — аналогична вышерассмотренной, но используется М интервалов

(М — скаляр); 

 N=hist(Y.X) — возвращает числа попаданий элементов вектора Y в интервалы,

центры которых заданы элементами вектора X;

[N,X]=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.

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

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



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


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

slice(X.Y.Z.V.Sx,Sy,Sz) — строит плоские сечения объемной фигуры V в направлении осей

x,y,z c

позициями, задаваемыми векторами Sx, Sy, Sz. Массивы X, Y, Z задают координаты для V и должны быть монотонными и трехмерными (как возвращаемые функцией meshgrid) с размером MxNxP. Цвет точек сечений определяется трехмерной интерполяцией в объемной фигуре V;

slice(X,Y.Z.V,XI.YI.ZI) — строит сечения объемной фигуры V по поверхности, определенной массивами XI, YI, ZI;

slice (... 'method') — при построении задается метод интерполяции, который может быть одним из следующих: 'linear', 'cubic' или 'nearest'. По умолчанию используется линейная интерполяция — 'linear';

slice(V.Sx.Sy.Sz) или slice(V.XI.YI.ZI) - подразумевается X=1:N, Y=1:M, Z=1:P; 

 H=slice(...) — строит сечение и возвращает дескриптор объекта класса surface.

График примера, приведенного ниже, представлен на рис. 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])



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


Функции одной переменной

у(х)

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

X

и вертикальная

Y,

и задаются координаты

х

и

у,

определяющие узловые точки функции

у(х).

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

у(х)

задается векторами X и Y одинакового размера.

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

plot (X, Y) — строит график функции

у(х),

координаты точек

(х, у)

которой берутся из векторов одинакового размера Y и X. Если X или Y — матрица, то строится семейство графиков по данным, содержащимся в колонках матрицы.

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

sin(x)

и

cos(x),

значения функции которых содержатся в матрице Y, а значения аргумента

х

хранятся в векторе X:

» х=[0 12345]; 

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

» plot(x.Y)

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

Рис. 6.1.

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

plot(Y) — строит график

у(г),

где значения

у

берутся из вектора Y, a

i

представляет собой индекс соответствующего элемента. Если Y содержит комплексные элементы, то выполняется команда plot (real (Y). imag(Y)). Во всех других случаях мнимая часть данных игнорируется.

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


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

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

» plot(y)

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





Рис. 6.2.



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

 plot(X.Y.S) — аналогична команде plot(X.Y), но тип линии графика можно задавать с помощью строковой константы S.

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



Цвет линии



Y

Желтый

М

Фиолетовый

С

Голубой

R

Красный

G

Зеленый

В

Синий

W

Белый

К

Черный



Тип точки



.

Точка

0

Окружность

X

Крест

+

Плюс

*

Звездочка

S

Квадрат

D

Ромб

V

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

А

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

<

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

>

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

Р

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

H

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



Тип линии



-

Сплошная

;

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

-.

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

--

Штриховая

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

 рlot (X1. Y1, S1, Х2, Y2. S2. ХЗ. Y3, S3,...) — эта команда строит на одном графике ряд линий, представленных данными вида (X..Y..S.), где X. и Y. — векторы или матрицы, a 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 строится штрих пунктирной линией с точками в виде знака «плюс» красного цвета, а график уЗ строится штриховой линией с кружками черного цвета. К сожалению, на черно-белых рисунках этой книги вместо разных цветов видны разные градации серого цвета.


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


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

z(x, у).

Она строит аксонометрическое изображение трехмерных поверхностей и представлена следующими формами:

plot3(x.y,z) — строит массив точек, представленных векторами х, у и z, соединяя их отрезками прямых. Эта команда имеет ограниченное применение;

plot3(X,Y,Z), где X, Y и Z — три матрицы одинакового размера, строит точки с координатами X(i.:), Y(i,:) и Z(i,:) и соединяет их отрезками прямых.

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

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

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

» Z=X.

^

2+Y.^2;

» plot3(X.Y.Z)

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

Рис. 6.18.

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

plot3 (X. Y, Z, S) — обеспечивает построения, аналогичные рассмотренным ранее, но со спецификацией стиля линий и точек, соответствующей спецификации команды plot. Ниже дан пример применения этой команды для построения поверхности кружками:

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

» Z=X.

^

2+Y.^2; 

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

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

Рис. 6.19.

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

plot3(xl ,yl.zl, sl.х2,у2.z2. s2. хЗ,уЗ.z3,s3,...)— строит на одном рисунке графики нескольких функций zl(xl ,yl), z2(x2,y2) и т. д. со спецификацией линий и маркеров каждой из них.

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

» [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.

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

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



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


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

surfl(...) — аналогична команде surf (...), но строит график поверхности с подсветкой от источника света;

surfl (Z.S) или surfl(X,Y,Z,S) — строит графики поверхности с подсветкой от источника света, положение которого в системе декартовых координат задается вектором S=[Sx,Sy.Sz], а в системе сферических координат — вектором S=[AZ.EL];

surfl (..., 'light') — позволяет при построении задать цвет подсветки с помощью объекта Light;

surfl (..., 'cdata') — при построении имитирует эффект отражения;

surfl(X,Y,Z,S.K) — задает построение поверхности с параметрами, заданными вектором K=[ka,kd,ks.spread], где ka — коэффициент фоновой подсветки, kd — коэффициент диффузного отражения, ks — коэффициент зеркального отражения и spread — коэффициент глянцевитости;

H=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 — для освещенности и т. д. Это правило облегчает запоминание многочисленных команд графики.


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


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

surfc(...) — аналогична команде 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 с проекцией и шкалой цветов



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


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

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, где [m.n]=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 задают координатные оси и свойства поверхности, которые могут использоваться для большей эффектности показа поверхности или фигуры.

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

» [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.



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

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


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


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

meshz(...) — аналогична mesh(...), но строит поверхность как бы в виде столбиков. Следующий пример иллюстрирует применение команды mesh:

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

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

» meshz(X,Y,Z)

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

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

Рис. 6.24.

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



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


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

[X.Y,Z]=sphere(N) — генерирует матрицы X, Y и Z размера (N+l)x(N+l) для последующего построения сферы с помощью команд surf (X, Y.Z) или surfl (X. Y.Z);

[X,Y.Z]=sphere — аналогична предшествующей функции при N=20.

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

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

» surfl(X,Y,Z)

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

Рис.

6.53.

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

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



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


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

gtext('string') — задает выводимый на график текст в виде строковой константы ' string' и выводит на график перемещаемый мышью маркер в виде крестика. Установив маркер в нужное место, достаточно щелкнуть любой кнопкой мыши для вывода текста;

gtext (С) — позволяет аналогичным образом разместить многострочную надпись из массива строковых переменных С.

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

» х=-15:0.1:15;

» plot(x, sin(x).

^

3)

» gtext('Function sin(x).^3')

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

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

Рис. 6.34.

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

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

Рис. 6.35.

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



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


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

subplot — создает новые объекты класса axes (подокна);

subplot(m.n.p) или subplot(mnp) — разбивает графическое окно на

тхп

подокон, при этом m — число подокон по горизонтали, n — число подокон по вертикали, а р— номер подокна, в которое будет выводиться текущий график (подокна отсчитываются последовательно по строкам);

subplot(H), где Н — дескриптор для объекта axes, дает альтернативный способ задания подокна для текущего графика;

subplot( 'position',[left bottom width height]) — создает подокно с заданными нормализованными координатами (в пределах от 0.0 до 1.0);

subplot(lll) Hclf reset — удаляют все подокна и возвращают графическое окно в обычное состояние.

Рис. 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).

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



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


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

mesh(X,Y,Z,C) — выводит в графическое окно сетчатую поверхность Z(X.Y) с цветами узлов поверхности, заданными массивом С;

mesh(X.Y.Z) — аналог предшествующей команды при C=Z. В данном случае используется функциональная окраска, при которой цвет задается высотой поверхности.

Возможны также формы команды 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:

meshc(...) — аналогична mesh(...), но помимо графика поверхности дает изображение ее проекции в виде линий равного уровня (графика типа contour).

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

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

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

» meshc(X,Y,Z)

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

Рис. 6.23.

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

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



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


Трехмерные поверхности обычно описываются функцией двух переменных

z(x, у).

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

х

и

у,

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

[X.Y] = meshgrid(x) — аналогична [X.Y] = meshgrid(x.x);

[X.Y.Z] = meshgrid(x.y,z) — возвращает трехмерные массивы, используемые для вычисления функций трех переменных и построения трехмерных графиков;

[X.Y] = meshgrid(x.y) — преобразует область, заданную векторами х и у, в массивы X и Y, которые могут быть использованы для вычисления функции двух

переменных и построения трехмерных графиков. Строки выходного массива X являются копиями вектора х; а столбцы Y — копиями вектора у.

Пример:

» [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:

[Х1.Х2.ХЗ,...] = ndgrid(xl,x2,x3....) — преобразует область, заданную векторами xl.x2.x3..., в массивы Х1.Х2.ХЗ..., которые могут быть использованы для вычисления функций нескольких переменных и многомерной интерполяции, i-я размерность выходного массива xi  является копией вектора xi;

[XI.Х2....] = ndgrid(x) - аналогична [XI.Х2....] = ndgrid(x,x,...). Пример применения функции ndgrid представлен ниже:

»[Х1.'Х2] = ndgrid(-2:.2:2. -2:.2:2); 

»Z = XI .* ехр(-Х1."2 - Х2.*2); 

»mesh(Z)

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



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


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

patch(X,Y,C) — создает закрашенный многоугольник, вершины которого заданы векторами X и Y в текущей системе координат, а спецификация окраски задана вектором цветовой палитры С. Можно также задавать цвет с помощью символьной переменной 'color' вида 'г', 'д', 'b', 'с', 'т', 'у', V или V. X и Y могут быть матрицами;

patch(X,Y.Z,C) — создает многоугольник в трехмерной системе координат, при этом матрица Z должна иметь тот же размер, что X и Y.

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

» Х=[1 2 3 2 1];

» Y=[1 2 0 5 1];

» patch(X,Y,[1 0 0])

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

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

Рис. 6.46.

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



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


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

diffuse — задание эффекта диффузионного рассеяния;

lighting — управление подсветкой;

material — имитация свойств рассеивания света различными материалами;

specular — задание эффекта зеркального отражения.

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

view — задание положения точки просмотра;

viewmtx — задание и вычисление матрицы вращения;

rotateSd — задание поворота трехмерной фигуры.

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



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


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

bar(x, Y) — строит столбцовый график элементов вектора Y (или группы столбцов для матрицы Y) со спецификацией положения столбцов, заданной значениями элементов вектора х, которые должны идти в монотонно возрастающем порядке;

bar(Y) — строит график значений элементов матрицы Y так же, как указано выше, но фактически для построения графика используется вектор х=1:m;

barU.Y,WIDTH) или BAR(Y,WIDTH) — команда аналогична ранее рассмотренным, но со спецификацией ширины столбцов (при WIDTH > 1 столбцы в одной и той же позиции перекрываются). По умолчанию задано WIDTH = 0.8.

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

для задания спецификации графиков, например типа линий, цвета и т. д., по аналогии с командой plot. Спецификация 'stacked' задает рисование всех n столбцов в позиции m друг на друге.

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

»

%

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

» subplot(2.1.1). bar(rand(12.3).'stacked'), colormap(cool)

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

Рис. 6.6.

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

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

» subplot(2.1.1). barh(rand(5.3).'stacked'), colormap(cool)

Рис. 6.7.

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

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



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


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

trimesh(TRI,X,Y,Z,C) — построение объемной каркасной фигуры с треугольниками, специфицированными матрицей поверхности TRI, каждая строка которой содержит три элемента и задает одну треугольную грань путем указания индексов, по которым координаты выбираются из векторов X, Y, Z. Цвета ребер задаются вектором С;

trimesh(TRI.X.Y.Z) — построение, аналогичное предшествующему при C=Z, т. е. с цветом ребер, зависящим от значений высоты;

H=trimesh(...) — строит график и возвращает дескрипторы графических объектов;

trimesh(..., 'param'. 'value'. 'param', 'value'...) — добавляет значения 'value' для параметров 'param'.

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



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


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

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

contour3(...) — имеет синтаксис, аналогичный команде contour(...), но строит линии равного уровня в аксонометрии с использованием функциональной окраски (окраска меняется вдоль оси Z).

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

contour3(Z) — строит контурные линии для поверхности, заданной массивом Z, без учета диапазона изменения

х

и

у;

contour3(Z.n) — строит то же, что предыдущая команда, но с использованием п секущих плоскостей (по умолчанию n=10);

contour3(X,Y,Z) — строит контурные линии для поверхности, заданной массивом Z, с учетом изменения

х и у.

Двумерные массивы X и Y создаются с помощью функции meshgrid;

contours(X.Y.Z.n) — строит то же, что предыдущая команда, но с использованием п секущих плоскостей.

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

» contour3(peaks,20) 

» colormap(gray)

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

Рис. 6.31.

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

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

C=contour3(...) — возвращает матрицу описания контурных линий С для использования командой clabel;

[С, H]=contour3(...) — возвращает массив С и вектор-столбец Н дескрипторов объектов path для каждой линии уровня. Свойство UserData каждого объекта содержит значение высоты для соответствующего контура.



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


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

rose(THETA) — строит угловую гистограмму для 20 интервалов по данным вектора ТНЕТА;

rose(ТНЕТА, N) — строит угловую гистограмму для N интервалов в пределах угла от 0 до 2*рi по данным вектора ТНЕТА;

rose(ТНЕТА. X) — строит угловую гистограмму по данным вектора ТНЕТА со спецификацией интервалов, указанной в векторе X.

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

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

Рис. 6.13.

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

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



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


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

axis([XMIN XMAX YMIN YMAX]) — установка диапазонов координат по осям

х

и

у

для текущего двумерного графика;

axis([XMIN XMAX YMIN YMAX ZMIN ZMAX]) - установка диапазонов координат по

осям

х, у

и

z

текущего трехмерного графика; 

axis auto — установка параметров осей по умолчанию;

axis manual — «замораживает» масштабирование в текущем состоянии, чтобы при использовании команды hold on следующие графики использовали те же параметры осей;

axis tight — устанавливает диапазоны координат по осям в соответствии с диапазонами изменения данных;

axis ij — задает «матричную» прямоугольную систему координат с началом координат в левом верхнем углу, ось i — вертикальная, размечаемая сверху вниз, ось j — горизонтальная и размечается слева направо;

axis xy — устанавливает декартову систему координат с горизонтальной осью

х,

размечаемой слева направо, и вертикальной осью

у,

размечаемой снизу вверх. Начало координат размещается в нижнем левом углу;

axis equal — включает масштаб с одинаковым расстоянием между метками по осям

х, у

и

z;

axis image — устанавливает масштаб, при котором пикселы изображения становятся квадратами;

axis square — устанавливает текущие оси в виде квадрата (или куба в трехмерном случае) с одинаковым расстоянием между метками и одинаковой длиной осей;

axis normal — восстанавливает масштаб, отменяя установки axis equal и axis square;

axis vis3d — «замораживает» пропорции осей для возможности поворота трехмерных объектов;

axi s off — убирает с осей их обозначения и маркеры; 0 axis on — восстанавливает ранее введенные обозначения осей и маркеры;

V=axis — возвращает вектор-строку, содержащую коэффициенты масштабирования для текущего графика. Если текущий график двумерный, то вектор имеет 4 компонента, если трехмерный — 6 компонентов.

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

» х=-5:0.1:5;

» plot(x,sin(x));

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

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

Рис. 6.39.

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

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

х

и

у.



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


Для установки надписей возле осей

х, у

и 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

» xlabel'Axis X')

» ylabel'Axis Y')

» zlabel'Axis Z')

» title 'Surface graphic')

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

Рис. 6.32.

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

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



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


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

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

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

colormap( 'default') — устанавливает палитру по умолчанию, при которой распределение цветов соответствует радуге;

colormap(MAP) — устанавливает палитру RGB, заданную матрицей MAP; 

C=colormap — функция возвращает матрицу текущей палитры цветов С. m-файл с именем colormap устанавливает свойства цветов для текущего графика.

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

hsv — цвета радуги;

hot — чередование черного, красного, желтого и белого цветов;

gray — линейная палитра в оттенках серого цвета;

bone — серые цвета с оттенком синего;

copper — линейная палитра с оттенками меди;

pink — розовые цвета с оттенками пастели;

white — палитра белого цвета;

flag — чередование красного, белого, синего и черного цветов;

lines — палитра с чередованием цветов линий;

colorcube — расширенная палитра RGB;

jet — разновидность палитры HSV;

prism — призматическая палитра цветов;

cool — оттенки голубого и фиолетового цветов;

autumn — оттенки красного и желтого цветов;

spring — оттенки желтого и фиолетового цветов;

winter — оттенки синего и зеленого цветов;

summer — оттенки зеленого и желтого цветов.

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



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


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

псевдоцвета,

зависящие от содержимого ячеек. Такое представление реализуют команды класса pcolor:

pcolor (С) — задает представление матрицы С в псевдоцвете;

pcolor(X,Y,C) — задает представление матрицы С на сетке, формируемой векторами или матрицами X и Y.

Рис. 6.45.

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

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

» z=peaks(40);

» colormap(hsv)

» pcolor(z)

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

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



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


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

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

caxis(V) — с помощью двухэлементного вектора V со списком элементов [cmin cmax] устанавливает диапазон используемой палитры цветов для объектов surface и patch, создаваемых такими командами, как mesh, pcolor и surf. Пикселы, цвета которых выходят за пределы [cmin cmax], приводятся к граничным цветам диапазона;

caxis('manual') — устанавливает шкалу цветов по текущему интервалу параметра, задающего цвет;

caxis('auto') — устанавливает типовое масштабирование шкалы цветов, при котором диапазон используемых цветов соответствует диапазону изменения данных от -Inf до Inf. Линии и грани с цветами, равными NaN, отсекаются.

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



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


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

title( 'string

'

) — установка на двумерных и трехмерных графиках титульной надписи, заданной строковой константой 'string'.

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



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


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

pie3(...) — аналогична команде pie(...), но дает построение объемных секторов.

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

» Х=[1 2 3 4 5];

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

Рис. 6.51.

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

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



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


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

grid on — добавляет сетку к текущему графику;

grid off — отключает сетку;

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, на котором сетка отсутствует. Нетрудно заметить, что наличие сетки облегчает количественную оценку координат точек графика.



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


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

text(X.Y. 'string') — добавляет в двумерный график текст, заданный строковой константой 'string', так что начало текста расположено в точке с координатами

(X, Y).

Если X и Y заданы как одномерные массивы, то надпись помещается во все позиции [x(i) ,y(i)];

text(X,Y,Z. 'string') — добавляет в трехмерный график текст, заданный строковой константой 'string', так что начало текста расположено в позиции, заданной координатами X, Y и Z.

В приведенном ниже примере надпись «График функции 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.

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

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

3

x.

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

» х=-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 и выводит в пустом графике математическую формулу в формате ТеХ вида:

e

jwt

=

cos(wt) + sin(wt)

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

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



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


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

легендой.

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

legend(stringl,string2. strings,...) — добавляет к текущему графику легенду в

виде строк, указанных в списке параметров;

 legend (H.stringl,string2. strings,...) — помещает легенду на график, содержащий

объекты с дескрипторами Н, используя заданные строки как метки для соответствующих дескрипторов;

 legend( АХ . ...) — помещает легенду в осях (объект класса axes) с дескриптором АХ; 

legend (М) — размещает легенду, используя данные из строковой матрицы М; 

legend OFF — устраняет ранее выведенную легенду; 

 legend — перерисовывает текущую легенду, если таковая имеется; 

 legend( I egendhandl е) — перерисовывает легенду, указанную дескриптором legendhandle;

legend (....Pos) — помещает легенду в точно определенное место, специфицированное параметром Pos:

 Pos=0 — лучшее место, выбираемое автоматически;

Pos=l — верхний правый угол;

Pos=2 — верхний левый угол;

Pos=3 — нижний левый угол;

Pos=4 — нижний правый угол;

Pos=-l — справа от графика.

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

[legh,objh]=legend(...) — эта функция возвращает дескриптор объекта для легенды (legh) и матрицу objh, содержащую дескрипторы объектов, из которых легенда состоит.

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

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

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

» y1=sin(x); 

» y2=sin(x).^2;

» plot(x,y1, '-m' ,x,y2 '-.+r')

» legend( 'Function 1', 'Function 2');


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



Рис. 6.36.

График трех функций с легендой в поле графика
Незначительная модификация команды legend (применение дополнительного параметра -1) позволяет построить график трех функций с легендой вне поля графика:
» x=-2*pi:0.1*pi:2*pi;
» yl=sin(x);
» y2=sin(x).
^
2;
» y3=sin(x).
^
3;
» plot(x,y1,'-m',x,y2.'-.+r',x,y3,'--ok')
» legend(' Function 1','Function 2','Function 3'.-l);
Соответствующий график показан на рис. 6.37.


Рис. 6.37.

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

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


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

colorbar( 'vert') — выводит вертикальную шкалу цветов на текущий график; 

colorbar( 'horiz') — выводит горизонтальную шкалу цветов на текущий график;

colorbar(H) — выводит шкалу цветов на график с дескриптором Н с автоматическим размещением шкалы по вертикали или по горизонтали в зависимости от соотношения размеров графика;

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 со шкалой цветов.