MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

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

Базовые графические объекты.

Базовые (Core) графические объекты занимают нижний уровень в иерархии графических объектов MATLAB, предком базовых графических объектов являются оси. Следовательно, их вывод возможен только при наличии осей, которые при желании можно сделать невидимыми и, кроме того, совпадающими по размеру с графическим окном. Тогда базовые объекты можно размещать в произвольном месте области графического окна. Всего в MATLAB существует семь базовых графических объектов:

  • Рисунок (Image). Создается функцией image, в списке ее входных аргументов надо указать массив, содержащий информацию о цвете каждого пикселя в формате RGB (трехмерный массив) или индексированный цвет (двумерный массив). Для чтения этой информации из графического файла служит функция imread, которая понимает основные графические форматы: bmp, gif, jpeg, pcx, tiff и др.
  • Источник света (Light). Создается функцией light и служит для освещения поверхности (Surface) и полигонального объекта (Patch). На одних осях может быть расположено несколько источников света, каждый со своими свойствами: цвет света, тип лучей. Лучи могут быть параллельные, т.е. идущие от бесконечно удаленного источника, или лучи, исходящие из точечного источника, расположенного в определенной точке пространства.
  • Линия (Line). Ломаная линия создается функцией line и задается координатами вершин. Возможно изменять стиль, цвет и толщину линии, размещать различные маркеры в вершинах и выбирать их размер, цвет границы и внутренности.
  • Полигональный объект (Patch). Создается функцией patch. Служит для создания плоских и трехмерных объектов, в том числе и достаточно сложной формы. Полигональный объект задается либо координатами вершин каждой грани, либо координатами всех вершин и тем, какие грани они образуют. Возможны различные способы закраски граней и ребер полигонального объекта: как постоянным цветом, так и цветами, меняющимися от вершины к вершине, а также указание прозрачности граней и ребер и свойств, отвечающих за освещение полигонального объекта
  • Прямоугольник (Rectangle). Создается функцией rectangle, которая позволяет указать величину скругления углов. Так что можно рисовать не только прямоугольник или квадрат, но и эллипс и круг. Возможно изменять цвет границы и внутренности, а так же стиль линии границы.
  • Поверхность (Surface). Создается функцией surface. Поверхность задается на прямоугольной сетке значениями в каждом ее узле. Обычно, для создания прямоугольной сетки применяется функция meshgrid. Возможно изменение цвета ячеек и их границ, способов их закраски, прозрачности ячеек и границ, свойств линий границ ячеек, указание свойств, отвечающих за освещение поверхности светом, а также размещение маркеров заданного вида, размера и цвета в вершинах ячеек.
  • Текстовый объект (Text). Создается функцией text. Текст может быть отформатирован различными шрифтами и начертанием, цветом, заключен в рамку (свойства линий рамки и цвет ее внутренности можно изменять), повернут на заданный угол. Для набора математических формул доступны возможности TeX и LaTeX.

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

  • Справочник свойств графических объектов MATLAB: Handles Graphics Property Browser (в правом окне далее надо перейти по гиперссылке Axes, далее в дереве по ссылке Core Objects).
  • MATLAB: Graphics: Handle Graphics Objects: Core Objects.
  • Работа с графическими изображениями (объектами Image) описана в разделе MATLAB: Graphics: Displaying Bit-Mapped Images.
  • Моделирование сложных объектов при помощи полигональных объектов рассмотрено в разделе MATLAB: 3-D Visualization: Creating 3-D Models with Patches.
  • Техника освещения объектов разбирается в разделе MATLAB: 3-D Visualization: Lighting as a Visualization Tool.
  • Свойства графических объектов, отвечающие за их прозрачность и их использование см. в разделе MATLAB: 3-D Visualization: Transparency.
  • Кроме того, для быстрого перехода к свойствам объектов можно посмотреть справку по низкоуровневой функции, которая создает данный объект: image, text, line, rectangle, surface, patch, light, например:
	>> doc text
(для отображения окна браузера справочной системы с информацией о функции text и текстовом объекте), или
	>> help text
(для вывода краткой информации о функции text в командное окно, выводятся также гиперссылки для перехода к описанию родственных функций).

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

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

Размещение текстового объекта, определение его размеров и положения.

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

Для получения такого графика достаточно выполнить следующие команды:
	>> x = -1:0.05:1;
	>> y = exp(x).*sin(3*x);
	>> plot(x, y)
и добавить текстовый объект при помощи функции text. Первыми ее входными аргументами являются координаты объекта, а сам текст задается строкой:
	>> hT = text(0, -0.5, 'y(x)=exp(x)sin(3x)')
Функция text возвращает указатель на созданный текстовый объект, который в данном случае записан в переменную hT. Он может понадобиться для дальнейшего изменения свойств текстового объекта, например размера шрифта. По умолчанию, размер шрифта 10 пт, что написано в справочной системе MATLAB в разделе с информацией о текстовых объектах, до которого проще всего добраться при помощи команды
	>> doc text
(см. таблицу внизу страницы этого раздела справочной системы). За размер шрифта отвечает свойство FontSize. Напомним, что текущее значение какого-либа свойства графического объекта всегда можно узнать при помощи функции get:
	>> get(hT, 'FontSize')
ans =
    10
Действительно, размер 10 и именно пунктов, поскольку в MATLAB пункты выбраны по умолчанию в качестве единиц для задания размера шрифта. Выбор единиц измерения размера шрифта определяется значением свойства FontUnits текстового объекта, которое по умолчанию есть 'points' (т.е. пункты, 1пт = 1/72 дюйма). Возможно отказаться от пунктов и выбрать другие значения свойства FontUnits, ими могут быть:
  • 'inches' (дюймы);
  • 'centimeters' (сантиметры);
  • 'pixels' (пиксели);
  • 'normalized' (нормализованные).
Выбор нормализованных единиц удобен, если размер шрифта должен определяться размером осей (1 нормализованная единица равна высоте осей), скажем, требуется разместить текстовую надпись высотой в половину высоты оси ординат:
	>> figure
	>> axes
	>> hT1 = text(0, 0.5, 'ABC')
	>> set(hT1, 'FontUnits', 'normalized', 'FontSize', 0.5)

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

В этом примере мы сначала создали графическое окно и оси при помощи функций figure и axes, соответственно. Обратите внимание, что по умолчанию функция axes создает оси, у которых пределы оси абсцисс и оси ординат есть [0, 1]. При выводе текстового объекта функцией text мы указали координаты: 0 по оси абсцисс и 0.5 по оси ординат. Сейчас абсцисса левого нижнего угла текстового объекта равна нулю, а середина текстового объекта по вертикали имеет ординату 0.5. Так происходит потому, что два свойства текстового объекта: HorizontalAlignment и VerticalAlignment, отвечающие за выравнивание текста соответственно по горизонтали и вертикали, по умолчанию имеют следующие значения:

HorizontalAlignment = 'left'   и   VerticalAlignment = 'middle'.
Свойство HorizontalAlignment может принимать значения 'left' (по умолчанию), 'center' и 'right', а VerticalAlignment - 'top', 'cap', 'middle', 'baseline', 'bottom'. Смысл значений свойства HorizontalAlignment вполне очевиден. Значения 'cap', 'middle' и 'baseline' означают вертикальное выравнивание по заглавным буквам, середине и нижней линии текста, соответственно. Поместим текст "ApqC" размера 70пт в точку с координатами (0, 0.5) и для наглядности нарисуем линию, параллельную горизонтальной оси, которая проходит через y = 0.5:
	>> figure
	>> axes
	>> hT2 = text(0, 0.5, 'ApqC')
	>> set(hT2, 'FontSize', 70)
	>> line([0 1], [0.5 0.5])
Теперь, изменяя значение свойства VerticalAlignment, можно понаблюдать за поведением текста, см. рисунки:

>> set(hT2, 'VerticalAlignment', 'baseline')
>> set(hT2, 'VerticalAlignment', 'cap')
>> set(hT2, 'VerticalAlignment', 'middle')
(как по умолчанию)

Значения 'top' и 'bottom' свойства VerticalAlignment означают выравнивание некоторого прямоугольника, в который заключен текст (): 'top' - верхняя сторона прямоугольника имеет заданную координату (в нашем примере 0.5), 'bottom' - нижняя сторона прямоугольника имеет заданную координату (также 0.5 в нашем примере). Координаты этого прямоугольника определяются значением свойства Extent текстового объекта. Это свойство доступно только для чтения, его нельзя изменять и его значением является вектор из четырех элементов [left, bottom, width, height], где left и bottom - координаты левого нижнего угла прямоугольника, а width и height, соответственно, ширина и высота. По умолчанию, эти величины заданы в системе координат осей. Так происходит потому, что свойство Units (не путать с FontUnits) по умолчанию имеет значение 'data'. Другими возможными значениями свойства Units являются 'pixels' (пиксели), 'inches' (дюймы), 'centimeters' (сантиметры), 'points' (пункты) или нормализованные единицы (считается, что левый нижний угол осей имеет координаты (0, 0), а правый верхний - (1, 1)). Если значение свойства Units отлично от 'data', т.е. мы работаем не в системе координат осей, то меняется и смысл элементов вектора [left, bottom, width, height], который является значением свойства Extent. Именно, элементы left и bottom теперь равны расстоянию от нижнего левого угла осей по горизонтали и вертикали, соответственно, а width и height - ширина и высота прямоугольника, ограничивающего текстовый объект. Разумеется, left, bottom, width и height заданы в тех единицах измерения, которые выбраны при помощи свойства Units текстового объекта.

Размещение текста на трехмерных графиках.

При выводе текста на трехмерные графики следует в первых трех входных аргументах функции text указывать три координаты текстового объекта. Построим, например график поверхности, задаваемой функцией peaks, которая используется во многих примерах справочной системы MATLAB, и рядом с точкой максимума поверхности разместим текст "Maximum". Соответственно, подпишем точку минимума "Minimum".

Функция peaks возвращает массив (квадратную матрицу), размеры которой совпадают со значением ее входного аргумента. Запишем этот массив в переменную Z и найдем максимальное M и минимальное m значения в нем при помощи функций max и min, соответственно. Напомним, что для поиска максимума в двумерном массиве следует два раза вызвать функцию max, поскольку результатом функции max является строка, содержащая максимальные элементы в каждом столбце (аналогично и для функции min). Далее используем функцию find для определения строчных и столбцевых индексов максимального и минимального элементов. Строчный и столбцевой индексы максимального элемента запишем в iM и jM, а минимального - в im и jm. Затем построим поверхность, обратившись к функции mesh. Если в функции mesh указан единственный входной аргумент - двумерный массив, то она строит поверхность, определяемую его значениями, при этом на оси абсцисс откладывается значение столбцевого индекса этого массива, а на оси ординат - значение строчного индекса. Останется вызвать функцию text для создания первого текстового объекта с надписью "Maximum" в точке с координатами (jM, iM, M+1) и второго, с надписью "Minimum", в точке с координатами (jm, im, m-1). Здесь в качестве третьей координаты взято M+1 и m-1 для того, чтобы текстовый объект находился на небольшом отдалении от поверхности. Соответствующие команды и результат приведены ниже.

figure
axes
Z = peaks(30);
M = max(max(Z))
[iM, jM] = find(Z == M)
m = min(min(Z))
[im, jm] = find(Z == m)
mesh(Z)
hTM = text(jM, iM, M+1, 'Maximum')
hTm = text(jm, im, m-1, 'Minimum')

Изменение вида текстового объекта.

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

  • FontAngle - наклон шрифта. Значения: 'normal' (прямой по умолчанию), 'italic' (курсив).
  • FontName - название шрифта. Значения: строка с названием шрифта, установленного на компьютере ('Helvetica ' по умолчанию).
  • FontSize - размер шрифта. Значение в пунктах (по умолчанию 10), или в тех единицах измерения, которые заданы при помощи свойства FontUnits (см. пункт Размещение текстового объекта, определение его размеров и положения).
  • FontWeight - жирность шрифта. Значения: 'normal (обычный, по умолчанию), или 'bold' (жирный).
  • Color - цвет шрифта. Значения: один из предопределенных цветов 'r', 'g', 'b', 'c', 'm', 'y', 'k', 'w', или вектор из трех компонент, задающий цвет в формате RGB (по умолчанию значение [0 0 0], т.е. текст выводится черным шрифтом).
  • EdgeColor - цвет рамки. Значения: 'none' (по умолчанию, поэтому рамки нет), или один из предопределенных цветов 'r', 'g', 'b', 'c', 'm', 'y', 'k', 'w', или вектор из трех компонент, задающий цвет в формате RGB.
  • BackgroundColor - цвет заливки. Значения: 'none' (по умолчанию, поэтому заливки нет), или один из предопределенных цветов 'r', 'g', 'b', 'c', 'm', 'y', 'k', 'w', или вектор из трех компонент, задающий цвет в формате RGB.
  • LineWidth - толщина границы рамки вокруг текстового объекта. Значение: толщина в пунктах (по умолчанию 0.5).
  • LineStyle - стиль линии рамки вокруг текстового объекта. Значения: '-' (по умолчанию, сплошная линия), '--' (штриховая линия), ':' (пунктирная линия), '-.' (штрих-пунктирная линия), 'none' (нет линии).
  • Margin - величина внутренних полей вокруг текста, точнее, расстояние от границ прямоугольника, ограничивающего текст, размеры и положение которого определяется значением свойства Extent текстового объекта (см. раздел Размещение текстового объекта, определение его размеров и положения), до границ рамки. Значение: расстояние в пикселях, большее нуля (по умолчанию 2 пикселя).
  • Rotation - поворот текстового объекта. Значение в градусах, отсчитываемое против часовой стрелки (по умолчанию 0).

Например, для получения такого графика:

достаточно выполнить следующие команды:
	figure
	axes
	fplot('3*x+1', [0 2], [], 'r')
	hold on
	fplot('0.5*x-1', [0 2], [], 'g')
	hT3 = text(1, 4.6, 'y=3x+1')
	set(hT3, 'Rotation', 30,...
	    'FontSize', 14, 'FontWeight', 'bold', 'FontName', 'Arial',...
	    'Color', 'r', 'EdgeColor', 'k', 'BackgroundColor', 'y',...
	    'LineWidth', 3, 'LineStyle', ':', 'Margin', 5)
	hT05 = text(1, 0, 'y=0.5x-1')
	set(hT05, 'Rotation', 6,...
	    'FontSize', 14, 'FontWeight', 'bold', 'FontName', 'Arial',...
	    'Color', 'r', 'EdgeColor', 'k', 'BackgroundColor', 'y',...
	    'LineWidth', 3, 'LineStyle', ':', 'Margin', 5)

Заметим, что перед добавлением текстового объекта на оси, на которых уже есть другие объекты (в нашем примере это график функции), нет необходимости применять команду hold on, которая используется для последовательного вывода нескольких графиков на одни оси. Так происходит потому, что низкоуровневая функция text не проверяет значения свойства NextPlot графического окна и осей, которые как раз и отвечают за способ вывода, а просто выводит текстовый объект на текущие оси. Разумеется, если осей нет вообще, функция text их предварительно создаст. Однако, здесь следует соблюдать осторожность, например при отсутствии осей команда

	text(100, 100, 'Outside')
приведет к их созданию, но текста на них не будет, поскольку создаваемые по умолчанию оси имеют пределы [0, 1] по каждой координате, а координаты текста заданы (100, 100). Сам текстовый объект, разумеется, присутствует, в чем несложно убедиться, задав пределы осей, скажем при помощи функции axis
	axis([0 200 0 200])
или воспользовавшись свойствами XLim и YLim осей, указатель на которые вернет gca.

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

	hT3 = text(1, 4.6, 'y=3x+1', 'Rotation', 30,...
	    'FontSize', 14, 'FontWeight', 'bold', 'FontName', 'Arial',...
	    'Color', 'r', 'EdgeColor', 'k', 'BackgroundColor', 'y',...
	    'LineWidth', 3, 'LineStyle', ':', 'Margin', 5)

Указание положения текстового объекта и надписи при помощи свойств. Пример: "бегущая строка".

Иногда возникает проблема перемещения существующего текстового объекта или изменения текстовой надписи. Конечно, ее можно решить удалением существующего текстового объекта при помощи функции delete и созданием нового в нужной точке и с требуемой надписью. Однако, проще изменить значение свойств Position и String, которые как раз и отвечают за расположение текстового объекта и его надписи.

Значением свойства Position является вектор из двух или трех компонент (координат текстового объекта), если третья компонента не указана, то она полагается равной нулю, что удобной при размещении текста на двумерных графиках. Единицы измерения определяются значением свойства Units и по умолчанию положение текста задается в системе координат осей (см. Размещение текстового объекта, определение его размеров и положения).

Значением свойства String может быть:

  • строка или строковая переменная для получения одной строки текста;
  • массив строк или массив ячеек, каждая ячейка которого содержит строку, для вывода многострочного текста.

Выводу многострочного текста посвящен отдельный пункт (см. Вывод многострочного текста). Сейчас в качестве примера использования свойств Position и String мы рассмотрим организацию вывода текста в виде бегущей строки.

Сначала создадим графическое окно черного цвета без панели инструментов и строки меню, причем установим для него пункты в качестве единиц измерения. Далее изменим его размеры так, чтобы его ширина составляла 150пт., а высота 20пт., причем левый нижний угол графического окна остался на месте. Создадим невидимые оси, совпадающие по размеру с графическим окном, и текстовый объект. Далее в цикле формируем строковую переменную str так, чтобы она содержала 15 идущих подряд символов заданного в строковой переменной TEXT текста, последовательно смещающихся по порядку от первого символа. Через 0.1 секунды будем изменять значение свойства String текстового объекта, присваивая ему содержимое строковой переменной str. В результате получим небольшое графическое окно, в которое в режиме бегущей строки выводится текст: "This is a simple example of creeping line".

	% создание графического окна размером 150пт. на 20пт. и невидимых осей
	hF = figure('Units', 'points', 'MenuBar', 'none', 'Color', 'k');
	p = get(hF, 'Position')
	set(hF, 'Position', [p(1) p(2) 150 20])
	axes('Position', [0 0 1 1], 'Visible', 'off')
	% создание текстового объекта с выравниванием по горизонтали по низу
	hT = text('Position', [0 0], 'VerticalAlignment', 'bottom', 'FontSize', 20, 'Color', 'g');
	% задание текста для бегущей строки
	TEXT = 'This is a simple example of creeping line';
	% создание пустой строковой переменной
	str = '';
	% изменение строковой переменной в цикле
	for k=1:length(TEXT)
	    if length(str)<15
	        str = [str TEXT(k)];
	    else
	        % здесь начинается эффект бегущей строки
	        str = [str(2:length(str)) TEXT(k)];
	    end
	    set(hT, 'String', str)
	    pause(0.1)
	end

Вывод многострочного текста.

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

Предположим, мы хотим разместить на осях в точке с координатами (0.5, 0.5) текст так, как показано на следующем рисунке:

С использованием массива ячеек это можно сделать следующим образом (для создания массива ячеек применяются фигурные скобки):
figure
axes
str = {'first line'; 'second line'; 'third line'};
hT = text(0.5, 0.5, str, 'FontSize', 20)
Разумеется, можно было не создавать специальной переменной str, а сразу использовать массив ячеек при создании текстового ообъекта:
hT = text(0.5, 0.5, {'first line'; 'second line'; 'third line'}, 'FontSize', 20)
Вместо массива ячеек можно задействовать массив строк, который создается из отдельных строк или строковых переменных при помощи функции char (она автоматически добавляет в конец каждой строки пробелы так, чтобы образующие массив строки оказались равной длины):
figure
axes
str = char('first line', 'second line', 'third line')
hT = text(0.5, 0.5, str, 'FontSize', 20)
В двух примерах, приведенных выше, создавался один текстовый объект, указатель на который записывался в переменную hT. Если в качестве координат текста указать векторы, длина которых совпадает с числом строк многострочного текста, то получится столько текстовых объектов, сколько строк в тексте:
figure
axes
str = {'first text object'; 'second text object'; 'third  text object'}
hTT = text([0.1 0.3 0.5], [0.2 0.4 0.6], str, 'FontSize', 20)

Теперь hTT является вектором указателей на три текстовых объекта, свойства которых можно изменять независимо, например:
set(hTT(1), 'Color', 'r', 'FontWeight', 'bold')
set(hTT(2), 'BackgroundColor', 'y', 'Color','b')
set(hTT(3), 'EdgeColor', 'm', 'LineWidth',5)

Аналогичным образом можно использовать массив строк для создания нескольких текстовых объектов при помощи одной функции text. Кроме того, допускается использование символа вертикальной черты | в качестве разделителя строк. Т.е. в приведенном выше примере вместо str = {'first text object'; 'second text object'; 'third text object'} можно было написать:

str = char('first text object','second text object', 'third  text object')
или
	str = 'first text object|second text object|third  text object' 

и результат был бы тем же самым.

Приведем пример, в котором на оси выводится матрица

следующим образом:

Сначала создается двумерный массив M, в который заносятся заданные элементы матрицы. Затем при помощи функции size в переменные m и n записывается число его строк и столбцов. Далее в графическом окне располагаются оси со следующими свойствами: пределы по оси абсцисс от 0 до n+1, по оси ординат - от 0 до m+1, подписи осей совпадают с номерами строк и столбцов, ось абсцисс расположена сверху, а ось ординат направлена вниз. Далее в цикле проходим по столбцам матрицы. На каждом шаге цикла текущий столбец числовых значений матрицы преобразуем в массив строк функцией num2str и создаем столько текстовых объектов, сколько элементов в столбце (т.е. столько, сколько строк в матрице). Массив строк указываем в функции text для создания текстовых объектов и записываем указатели на полученные объекты в соответствующие позиции двумерного массива указателей hT.

	M = [1 2 3 4; 5 6 7 8; 9 10 11 12]
	[m, n] = size(M);
	figure
	axes('XLim', [0 n+1], 'YLim', [0 m+1],...
	    'XTick', 1:n, 'YTick', 1:m,...
	    'YDir', 'reverse', 'XAxisLocation', 'top')
	hT = zeros(m, n)
	for j=1:n
	    C = M(:, j)
	    hT(:, j) = text(j*ones(1, m), 1:m, num2str(C),...
	        'HorizontalAlignment', 'center', 'FontSize', 30)    
	end

В результате на оси выводится матрица и в двумерный массив hT заносятся указатели на все созданные текстовые объекты. Этот массив можно использовать для дальнейшей работы с ними. Например, если требуется изменить цвет элементов второй строки на красный, то достаточно выполнить:

	set(hT(2,:), 'Color', 'r')

Если требуется выделить элементы, меньшие двух, синим цветом, от трех до семи - зеленым, а большие семи - красным так, как показано на рисунке ниже, то удобно применить логическое индексирование к массиву hT:

	set(hT(M>7), 'Color', 'r')
	set(hT(M>=3&M<=7), 'Color', 'g')
	set(hT(M<3), 'Color', 'b')

Примечание про логическое индексирование.

Логическое индексирование, т.е. обращение к элементам массива, удовлетворяющим некоторому условию, является очень удобным средством MATLAB для обработки данных. Примеры логического индексирования приведены в справочной системе MATLAB в разделе: Programming: Data Types: How Logical Arrays are Used. Например, если в некотором массиве A

A = [1 2 3; 12 1 2; 33 90 1];
надо заменить элементы, превосходящие среднее арифметическое его значений в полтора раза на среднее арифметическое, то достаточно использовать операторы:
m = mean(mean(A))
A(A>1.5*m) = m
Так происходит потому, что результатом операции сравнения (примененной к исходному массиву A) является логический массив (тип logical array) того же размера, что и A, в котором единицы означают выполнение проверяемого условия для соответствующих элементов массива A
A>1.5*m
ans =
     0     0     0
     0     0     0
     1     1     0

Указание этого массива в качестве индекса для исходного массива A приводит к обращению к тем его элементам, которым соответствуют логические единицы. В нашем примере это элементы с индексами 3, 1 и 3, 2, которые как раз и превосходят в полтора раза среднее арифметическое элементов заданного массива A.

Заголовок и подписи осей это текстовые объекты, потомки осей.

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

 hA = axes('CameraPosition', [-4 -5 5], 'Box', 'on')

и попытаться получить указатели на их потомков при помощи функции get и свойства Children осей, то мы получим пустой массив

get(hA,'Children')
ans =
   Empty matrix: 0-by-1

Так происходит потому, что в MATLAB по умолчанию эти четыре потомка осей имеют скрытые указатели и функция get их "не видит". Изменение этой установки производится с уровня объекта Root - корневого объекта в иерархии графических объектов MATLAB. Указатель на корневой объект всегда равен нулю, а за отображение скрытых указателей отвечает свойство ShowHiddenHandles корневого объекта. Если оно имеет значение 'off' (как по умолчанию), то объекты со скрытыми указателями не видны, а если 'on', то видны. Скрытие указателей используется для предотвращения случайного изменения пользователем вида графических объектов (см. разделе Скрытие указателей объектов приложения с GUI).

Установим свойство корневого объекта ShowHiddenHandles в 'on' и снова применим функцию get для получения указателей на потомков осей:

	set(0, 'ShowHiddenHandles', 'on')
	h = get(hA, 'Children')
	h =
	  155.0035
	  154.0035
	  153.0035
	  152.0035
Действительно, оси содержат четырех потомков, которые являются текстовыми объектами, в чем несложно убедиться, обратившись к их свойству Type:
	get(h, 'Type')
	ans = 
	    'text'
	    'text'
	    'text'
	    'text'

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

То, что MATLAB должен скрывать указатели на эти текстовые объекты при значении 'off' свойства ShowHiddenHandles корневого объекта, определяется значениями свойства HandleVisibility текстовых объектов. В данном случае значение свойства HandleVisibility всех четырех потомков осей есть 'off'

	get(h, 'HandleVisibility')
	ans = 
	    'off'
	    'off'
	    'off'
	    'off'
Итак, в массиве h содержится четыре указателя:
  • h(1) - указатель на текстовый объект, предназначенный для заголовка к осям. Это тот самый заголовок, который добавляется при помощи функции title.
  • h(2) - указатель на текстовый объект, предназначенный для подписи к оси z, которая может быть изменена при помощи функции zlabel.
  • h(3) - указатель на текстовый объект, предназначенный для подписи к оси y, которая может быть изменена при помощи функции ylabel.
  • h(4) - указатель на текстовый объект, предназначенный для подписи к оси x, которая может быть изменена при помощи функции xlabel.
Если Вы проделали приведенные выше команды, то теперь желательно вернуть свойству ShowHiddenHandles корневого объекта его первоначальное значение:
	set(0, 'ShowHiddenHandles', 'off')

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

На самом деле этот пример с доступом к скрытым указателям к текстовым объектам был приведен только для того, чтобы убедиться, что создаваемые оси действительно имеют четырех потомков - текстовые объекты. Указатели на эти объекты могут быть получены при помощи свойств Title, XLabel, YLabel и Zlabel осей.

Изменение свойств заголовка и подписей осей может быть выполнено при помощи высокоуровневых функций title, xlabel, ylabel и zlabel, которые допускают следующие способы вызова:

	title('текст заголовка', 'Свойство', значение, 'Свойство', значение, ... )
	xlabel('подпись к оси x', 'Свойство', значение, 'Свойство', значение, ... )
	ylabel('подпись к оси y', 'Свойство', значение, 'Свойство', значение, ... )
	zlabel('подпись к оси z', 'Свойство', значение, 'Свойство', значение, ... )
Здесь пары 'Свойство'-значение это название свойства текстового объекта и его возможное значение. Например, для получения заголовка, состоящего из нескольких строк, достаточно указать массив ячеек, каждая ячейка которого содержит нужную строку (см. Вывод многострочного текста)
	title({'Results'; 'of my experiment'})
Функции xlabel, ylabel и zlabel также допускают подписи к той паре осей, указатель на которую задан в их первом входном аргументе, например:
	xlabel (указатель на оси, 'подпись к оси x', 'Свойство', значение, 'Свойство', значение, ...)
При таком же способе обращения к функции title выводится ошибка, однако имеется функция title4ax (4 значит for, созвучное с four, а ax - axes), которая предназначена для вывода заголовка на определенные оси:
	title4ax (указатель на оси , 'текст заголовка', 'Свойство', значение, 'Свойство', значение, ...)
Впрочем, всегда можно узнать, какие оси текущие при помощи функции gca, которая возвращает указатель на текущие оси, затем вызывать функцию axes и сделать текущими нужные оси, разместить на них заголовок и подписи, а затем использовать функцию axes для того, чтобы вернуть предыдущее состояние осей:
	hA0=gca   % узнаем указатель на текущие оси
	axes(hA) % делаем текущими оси с указателем hA
	title('Заголовок')
	axes(hA0) % делаем текущими оси с указателем hA0, как и было раньше

Поиск по сайту:

Система Orphus

Яндекс.Метрика