Сделай Сам Свою Работу на 5

Графика и визуализация данных





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

Разберем сначала, как получить график функции одной переменной, к примеру:

на отрезке . Первый шаг состоит в задании координат точек по оси абсцисс. Заполнение вектора x элементами с постоянным шагом при помощи двоеточия позволяет просто решить эту задачу. Далее необходимо поэлементно вычислить значения f (x) для каждого элемента вектора x и записать результат в вектор f. Для построения графика функции осталось использовать какую-либо из графических функций MatLab. Достаточно универсальной графической функцией является plot. В самом простом случае она вызывается с двумя входными аргументами — парой x и f (т. е. plot выводит зависимость элементов одного вектора от элементов другого). Последовательность команд, приведенная ниже, приводит к появлению графического окна Figure No.1 с графиком функции (рис. 4.1).



» x=[-2:0.05:2];

» f=exp(x).*sin(pi*x)+x.^2;

» plot(x,f)

Рис. 4.1

Тип линии, цвет и маркеры определяются значением третьего дополнительного аргумента функции plot. Этот аргумент указывается в апострофах[1], например, вызов plot(x,f,'ro:') приводит к построению графика красной пунктирной линией, размеченной круглыми маркерами. Обратите внимание, что абсциссы маркеров определяются значениями элементов вектора x. Всего в дополнительном аргументе может быть заполнено три позиции, соответствующие цвету, типу маркеров и стилю линии. Обозначения для них приведены в табл. 4.1. Порядок позиций может быть произвольный, допустимо указывать только один или два параметра, например, цвет и тип маркеров. Посмотрите на результат выполнения следующих команд: plot(x,f,'g'), plot(x,f,'ko'), plot(x,f,':').



Функция plot имеет достаточно универсальный интерфейс, она, в частности, позволяет отображать графики нескольких функций на одних осях. Пусть требуется вывести график не только f (x), но и на отрезке [-2, 2]. Сначала необходимо вычислить значения g(x):

» g=exp(-x.^2).*sin(5*pi*x);

а затем вызвать plot, указав через запятую пары x, f и x, g и, при желании, свойства каждой из линий:

» plot(x,f,'ko-', x,g,'k:')

Таблица 4.1.

Сокращения для цвета, типа маркеров и стиля линий

Цвет Тип маркера
y желтый . точка
m розовый o кружок
c голубой x крестик
r красный + знак плюс
g зеленый * звездочка
b синий s квадрат
w белый d ромб
k черный v треугольник вершиной вниз
Тип линии ^ треугольник вершиной вверх
- сплошная < треугольник вершиной влево
: пунктирная > треугольник вершиной вправо
-. штрих-пунктирная p пятиконечная звезда
-- штриховая h шестиконечная звезда
             

 

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

достаточно выполнить последовательность команд:



» x1=[-4*pi:pi/10:-pi];

» y1=sin(x1);

» x2=[-pi:pi/30:0];

» y2=3*(x2/pi+1).^2;

» x3=[0:0.02:5];

» y3=3*exp(-x3)

» plot(x1,y1,x2,y2,x3,y3)

Заметьте, что графики ветвей функции отображаются различными цветами. Можно было поступить и по-другому, а именно: после заполнения x1, y1, x2, y2, x3 и y3 собрать вектор x для значений аргумента и вектор y для значений y(x) и построить зависимость y от x:

» x=[x1 x2 x3];

» y=[y1 y2 y3];

» plot(x,y)

Несложно догадаться, как построить график параметрически заданной функции, используя то обстоятельство, что plot отображает зависимость одного вектора от другого. Пусть требуется получить график астроиды: , , . Следует задать вектор t, затем в векторы x, y занести значения x(t), y(t) и воспользоваться plot для отображения зависимости y от x:

» t=[0:pi/20:2*pi];

» x=cos(t).^3;

» y=sin(t).^3;

» plot(x,y)

Функция comet позволяет проследить за движением точки по траектории параметрически заданной линии. Вызов comet(x,y) приводит к появлению графического окна[2], на осях которого рисуется перемещение точки в виде движения кометы с хвостом. Управление скоростью движения осуществляется изменением шага при определении вектора значений параметра.

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

§ loglog (логарифмический масштаб по обеим осям);

§ semilogx (логарифмический масштаб только по оси абсцисс);

§ semilogy (логарифмический масштаб только по оси ординат).

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

Графики оформляются в MatLab специальными командами и функциями. Сетка наносится на оси командой grid on, а убирается при помощи grid off. Заголовок размещается в графическом окне посредством функции title, входным аргументом которой является строка, заключенная в апострофы:

» title('Результаты эксперимента')

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

–1 — вне графика в правом верхнем углу графического окна;

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

1 — в верхнем правом углу графика (это положение используется по умолчанию);

2 — в верхнем левом углу графика;

3 — в нижнем левом углу графика;

4 — в верхнем левом углу графика.

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

Обратимся теперь к визуализации векторных и матричных данных. Самый простой способ отображения векторных данных состоит в использовании функции plot с вектором в качестве входного аргумента. При этом получающийся в виде ломаной линии график символизирует зависимость значений элементов вектора от их индексов. Второй дополнительный аргумент может определять цвет, стиль линии и тип маркеров, например: plot(x,'ko'). Вызов функции plot от матрицы приводит к нескольким графикам, их число совпадает с числом столбцов матрицы, а каждый из них является зависимостью элементов столбца от их строчных индексов. Цвет и стиль линий и тип маркеров сразу для всех линий так же определяется вторым дополнительным аргументом.

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

» x=[0.7 2.1 2.5 1.9 0.8 1.3];

» bar(x)

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

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

1) если сумма элементов вектора больше или равна единицы, то выводится полная круговая диаграмма, площадь каждого её сектора пропорциональна величине элемента вектора;

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

Сравните, например pie([0.1 0.2 0.3]) и pie([1 2 3]). Можно отделить некоторые секторы от всего круга диаграммы, для чего следует вызвать pie со вторым аргументом — вектором той же длины, что исходный. Ненулевые элементы второго вектора соответствуют отделяемым секторам. Следующий пример показывает, как отделить от диаграммы сектор, соответствующий наибольшему элементу вектора x:

» x=[0.3 2 1.4 0.5 0.9];

» [m,k]=max(x);

» v=zeros(size(x));

» v(k)=1;

» pie(x,v)

Подписи к секторам диаграммы указываются во втором дополнительном входном аргументе, который заключается в фигурные скобки[3]:

» pie([2400 3450 1800 5100],{'Март','Апрель','Май','Июнь'})

Функции bar и pie имеют аналоги:

§ barh — построение столбцевой диаграммы с горизонтальным расположением столбцов;

§ bar3, pie3 — построение объемных диаграмм.

При обработке больших массивов векторных данных часто требуется получить информацию о том, какая часть данных находится в том или ином интервале. Функция hist предназначена для отображания гистограммы данных и нахождения числа данных в интервалах. Входным аргументом hist является вектор с данными, а выходным — вектор, содержащий количество элементов, попавших в каждый из интервалов. По умолчанию берется десять равных интервалов. Например, вызов hist(randn(1,5000)) приводит к появлению на экране гистограммы данных, распределенных по нормальному закону, а n=hist(randn(1,5000)) к заполнению вектора n длины десять (при этом гистограмма не строится). Число интервалов указывается во втором дополнительном аргументе hist. Можно задать интервалы, использовав в качестве второго аргумента не число, а вектор, содержащий центры интервалов. Более удобно задавать интервалы не центрами, а границами. В этом случае требуется сначала определить количество элементов в интервалах при помощи функции histc, а затем применить bar со специальным аргументом 'histc', например:

» x=randn(1,10000);

» int=[-2:0.5:2];

» n=histc(x,int);

» bar(int,n,'histc')

Визуализация функций двух переменных в MatLab может быть осуществлена несколькими способами, но все они предполагают однотипные предварительные действия. Рассмотрим здесь только построение графиков функций двух переменных на прямоугольной области определения[4]. Предположим, что требуется получить поверхность функции на прямоугольнике , . Первый шаг состоит в задании сетки на прямоугольнике, т. е. точек, которые будут использоваться для вычисления значений функции. Для генерации сетки предусмотрена функция meshgrid, вызываемая от двух входных аргументов — векторов, задающих разбиения по осям x и y. Функция meshgid возвращает два выходных аргумента, являющиеся матрицами.

» [X,Y]=meshgrid(-1:0.1:1,0:0.1:2);

Матрица X состоит из одинаковых строк, равных первому входному аргументу — вектору в meshgrid, а матрица Y — из одинаковых столбцов, совпадающих со вторым вектором в meshgrid. Такие матрицы оказываются необходимыми на втором шаге при заполнении матрицы Z, каждый элемент которой является значением функкции z(x,y) в точках сетки. Несложно понять, что использование поэлементных операций при вычислении функции z(x,y) приводит к требуемой матрице:

» Z=exp(-X).*sin(pi*Y);

Для построения графика z(x,y) осталось вызвать подходящую графическую функцию, к примеру:

» mesh(X,Y,Z)

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

Рис. 4.2.

Команда colorbar приводит к отображению в графическом окне столбика, показывающего соотношение между цветом и значением z(x,y). Цветовые палитры графика можно изменять, пользуясь функцией colormap, например colormap(gray) отображает график в оттенках серго цвета. Некоторые цветовые палитры приведены ниже:

§ bone — похожа на палитру gray, но с легким оттенком синего цвета;

§ colorcube — каждый цвет изменяется от темного к яркому;

§ cool — оттенки голубого и пурпурного цветов;

§ copper — оттенки медного цвета;

§ hot — плавное изменение: черный-красный-оранжевый-желтый-белый;

§ hsv — плавное изменение (как цвета радуги);

§ jet — плавное изменение: синий-голубой-зеленый-желтый-красный;

§ spring — оттенки пурпурного и желтого;

§ summer — оттенки зеленого и желтого;

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

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

§ surf — залитая цветом каркасная поверхность;

§ meshc, surfc — поверхности с линиями уровня на плоскости xy;

§ contour — плоский график с линиями уровня;

§ contourf — залитый цветом плоский график с линиями уровня;

§ contour3 — поверхность, составленная из линий уровня;

§ surfl — освещенная поверхность

Все перечисленные функции допускают то же самое обращение, что и mesh, например:

» sufr(X,Y,Z)

» contourf(X,Y,Z)

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

» contourf(X,Y,Z,10)

Вместо числа линий уровня можно указать в векторе те значения z(x,y), для которых требуется построить линии уровня:

» contour(X,Y,Z,[-0.51 -0.25 -0.01 0.89])

Несколько сложнее нанести подписи с соответствующим значением z(x,y) к каждой линии уровня. Для этого придется вызвать contour с двумя выходными аргументами, первый из них — матрица с информацией о положении линий уровня, а второй — вектор с указателями[5] на линии. Полученные переменные следует использовать в качестве входных аргументов функции clabel:

» [CMatr, h] = contour(X, Y, Z,[-0.51 -0.25 -0.01 0.89]);

» clabel(CMatr, h)

Залитые цветом каркасные поверхности, построенные при помощи sufr и surfc, имеют постоянный цвет в пределах каждой ячейки. Команда shading interp, вызываемая после surf и surfc, служит для плавного изменения цвета в пределах ячеек и скрытия линий сетки на поверхности. Если желательно убрать сетку и сохранить постоянный цвет ячеек, то достаточно использовать shading flat, а shading faceted придает графику прежний вид.

Графические функции по умолчанию располагают поверхность так, что наблюдатель видит ее часть под некоторым углом, а другая — скрыта от взора. Положение наблюдателя определяется двумя углами: азимутом (AZ) и углом возвышения (EL). Азимут отсчитывается от оси, противоположной y, а угол возвышения — от плоскости xy (см. рис. 4.3, на котором положительные направления отсчета углов обозначены стрелками).

Рис. 4.3.

Осмотреть поверхность со всех сторон позволяет функция view. Вызов функции view с двумя выходными аргументами и без входных дает возможность определить текущее положение наблюдателя (углы выводятся в градусах):

» [AZ, EL]=view

AZ =

-37.5000

EL =

Эти значения MatLab использует по умолчанию при построении трехмерных графиков. Для задания положения наблюдателя следует указать азимут и угол возвышения (в градусах) в качестве входных аргументов view, например: view(0,90) показывает вид на график сверху. Перед поворотом графика целесообразно расставить обозначения к осям, используя, как и для двумерных графиков xlabel и ylabel, и zlabel для подписи к вертикальной оси. Функция view допускает еще несколько вариантов вызова:

§ view(3) — возврат к стандартным установкам;

§ view(x,y,z) — помещение наблюдателя в точку с координатами x, y и z.

Освещенная поверхность строится при помощи функции surfl, которая позволяет получить наглядное представление о поведении исследуемой функции. Следует учесть, что лучше сочетать вызов surfl с командой shading interp и цветовой палитрой, содержащей большое количество оттенков (gray, copper, bone, winter и т. д.), поскольку поверхность обладает свойствами рассеивания, отражения и поглощения света, исходящего от некоторого источника. Положение источника можно задавать в четвертом дополнительном аргументе surfl, причем либо вектором из двух элементов (азимут и угол возвышения источника), либо вектором из трех элементов (положение источника света в системе координат осей), например: surfl(X,Y,Z,[20 80]) или surfl(X,Y,Z,[6 8 11]).

Разберем теперь работу с несколькими графиками. Первый вызов любой графической функции приводит к появлению на экране графического окна Figure No. 1, содержащего оси с графиком. Однако, при дальнейших обращениях к графическим функциям прежний график пропадает, а новый выводится в тоже самое окно. Команда figure предназначена для создания пустого графического окна. Если требуется получить несколько графиков в разных окнах, то перед вызовом графических функций следует прибегать к figure. Графические окна при этом нумеруются так: Figure No. 2,Figure No. 3и т. д.

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

В одном графическом окне можно расположить несколько осей со своими графиками. Функция subplot предназначена для разбиения окна на части и определения текущей из них. Предположим, что требуется вывести графики на шесть пар осей в одно графическое окно (две по вертикали и три по горизонтали). Создайте графическое окно при помощи figure и выполните команду:

» subplot(2,3,1)

В левом верхнем углу окна появились оси. Первые два аргумента в subplot указывают на общее число пар осей по вертикали и горизонтали, а последний аргумент означает номер данной пары осей. Нумерация идет слева направо, сверху вниз. Используйте subplot(2,3,2), … , subplot(2,3,6) для создания остальных пар осей[6]. Вывод любой из графических функций можно направить в нужные оси, указав их при помощи subplot(2,3,k), например:

» subplot(2,3,3)

» bar([1.2 0.3 2.8 0.9])

» subplot(2,3,6)

» surf(X,Y,Z)

Задания для самостоятельной работы

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

§ в отдельные графические окна;

§ в одно окно на одни оси;

§ в одно окно на отдельные оси.

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

Варианты

1. ; ; .

; ; .

2. ; ; .

; ; .

3. ; ; .

; ; .

4. ; ; .

; ; .

5. ; ; .

; ; .

6. ; ; .

; ; .

7. ; ; .

; ; .

8. ; ; .

; ; .

9. ; ; .

; ; .

10. ; ; .

; ; .

Задания для самостоятельной работы

Построить график кусочно-линейной функции, отобразить ветви разными цветами и маркерами.

1. 2.

3. 4.

5. 6.

7. 8.

9. 10.

Задания для самостоятельной работы

Построить график параметрически заданной функции, используя plot и comet.

Варианты

1. ; . 2. ; .

3. ; . 4. ; .

5. ; . 6. ; .

7. ; . 8. ; .

9. ; . 10. ; .

Задания для самостоятельной работы

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

§ каркасной поверхностью;

§ залитой цветом каркасной поверхностью;

§ промаркированными линиями уровня (самостоятельно выбрать значения функции, отображаемые линиями уровня);

§ освещенной поверхностью.

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

Варианты

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.


[1] Он является строкой, о представлении строк и операциях с ними написано в § 7.

[2] Графическое окно должно находится поверх остальных окон для наблюдения за движением с самого начала.

[3] Второй аргумент является массивом ячеек, о массивах ячеек написано в § 8.

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

[5] MatLab является объектно-ориентированной системой, все графические объекты (окна, оси, линии, поверхности и т. д.) выстроены в определённой иерархии и с каждым объектом связывается некоторый указатель. В данном случае, каждой линии уровня ставится в соответствие элемент вектора h.

[6] Предварительное создание всех пар осей не является обязательным. Допустимо применять subplot непосредственно перед вызовом графической функции.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.