Функции построения графиков, такие как plot
, scatter
, и bar
позволяет быстро визуализировать данные с помощью основного контроля таких аспектов, как цвет и стиль линии. Чтобы создать пользовательские графики, можно объединить несколько графических объектов, задать свойства этих объектов или вызвать дополнительные функции. В R2019a и более ранних релизах распространенным способом хранения кода индивидуальной настройки и обмена им с другими является написание скрипта или функции.
Начиная с R2019b, можно создать реализацию класса для графиков, определив подкласс ChartContainer
базовый класс. Создание класса позволяет вам:
Предоставьте удобный интерфейс для пользователей - когда пользователи хотят настроить аспект вашего графика, они могут задать свойство, а не изменять и перезапускать ваш графический код. Пользователи могут изменять свойства в командной строке или просматривать их в Property Inspector.
Инкапсулируйте алгоритмы и примитивные графические объекты - Вы реализуете методы, которые выполняют вычисления и управляют базовыми графическими объектами. Организация вашего кода таким образом позволяет вам скрывать детали реализации от пользователей.
Когда вы задаете график, которая является производной от этого базового класса, образцы вашего графика являются представителями иерархии графических объектов. В результате ваши графики совместимы со многими аспектами графической системы. Для примера, gca
и findobj
функции могут вернуть образцы из ваших графиков.
Первая линия класса графика задает matlab.graphics.chartcontainer.ChartContainer
класс как суперкласс. Например, первая линия класса под названием ConfidenceChart
выглядит следующим образом:
classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer
В дополнение к указанию суперкласса включите следующие компоненты в определение класса.
Компонент | Описание |
---|---|
Блок общественной собственности | Этот блок определяет все свойства, к которым должны иметь доступ пользователи. Вместе эти свойства составляют пользовательский интерфейс вашего графика. |
Блок частной собственности | Этот блок хранит базовые графические объекты и другие детали реализации, к которым вы не хотите обращаться пользователям. В этом блоке установите следующие значения атрибутов:
|
| Этот метод устанавливает начальное состояние графика. Он выполняется один раз, когда MATLAB® создает объект. Определите этот метод в защищенном блоке, чтобы его мог выполнять только ваш класс. |
| Этот метод обновляет базовые объекты на графике. Он выполняется в течение следующего Определите этот метод в том же защищенном блоке, что и |
Вам не нужно писать метод конструктора для вашего класса, потому что конструктор унаследован от ChartContainer
базовый класс. Конструктор принимает необязательные входные параметры: родительский контейнер и любое количество аргументов пары "имя-значение" для настройки свойств на графике. Для примера, если вы задаете класс, называемый ConfidenceChart
который имеет общественную собственность XData
и YData
можно создать образец класса с помощью одной из следующих команд:
c = ConfidenceChart(gcf,'XData',[1 2 3],'YData',[4 5 6]) c = ConfidenceChart('XData',[1 2 3],'YData',[4 5 6])
Если вы хотите предоставить интерфейс, который принимает входные параметры так же, как это делает типичная функция, можно задать пользовательский метод конструктора. Дополнительные сведения см. в разделе Запись конструкторов для классов График.
Разделите свойства вашего класса как минимум между двумя блоками:
Общедоступный блок для хранения компонентов пользовательского интерфейса
Частный блок для хранения деталей реализации, которые вы хотите скрыть
Свойства, которые находятся в общем блоке, сохраняют входные значения, предоставленные пользователем. Например, график, на котором отображается линия, может хранить векторы x - и y - coordinate в двух общественной собственности. Поскольку аргументы пары "имя-значение" свойства являются необязательными входами в неявный метод конструктора, рекомендуемый подход состоит в том, чтобы инициализировать общественную собственность до значений по умолчанию. Если вы задаете общественную собственность, которые хранят значения координат, инициализируйте их в NaN
значения или пустые массивы создают пустой график, если пользователь вызывает конструктор без каких-либо входов.
Свойства, которые находятся в частном блоке, хранят базовые графические объекты, образующие график, в дополнение к любым вычисленным значениям, которые вы хотите хранить. В конечном счете, ваш класс будет использовать данные в общественную собственность, чтобы сконфигурировать базовые объекты. Путем включения Transient
и NonCopyable
атрибуты для частного блока, вы избегаете хранить избыточную информацию, если пользователь копирует или сохраняет образец графика.
Например, вот блоки свойств для графика, которая отображает Line
объект и Patch
объект. Блок общественной собственности хранит значения, которыми пользователь может управлять: x - и y - координаты линии, доверительное значение запаса, символ маркера и значение цвета. Блок частной собственности хранит Line
и Patch
объекты.
properties XData = NaN YData = NaN ConfidenceMargin = 0.15 MarkerSymbol = 'o' Color = [1 0 0] end properties(Access = private,Transient,NonCopyable) LineObject PatchObject end
The setup
метод выполняется один раз, когда MATLAB создает объект графика. Любые значения свойств, переданные в качестве аргументов пары "имя-значение" в метод конструктора, назначаются после выполнения этого метода.
Используйте setup
метод для:
Вызовите функции построения графика, чтобы создать примитивные графические объекты, которые вы хотите использовать на графике.
Сохраните примитивные объекты, возвращенные функциями построения графика, как частная собственность объекта диаграммы.
Сконфигурируйте примитивные графические объекты.
Сконфигурируйте оси.
Многие графические функции имеют дополнительный входной параметр для определения целевого объекта осей. Эти функции включают функции построения графика (такие как plot
, scatter
, и bar
) и функции, которые изменяют оси (такие как hold
, grid
, и title
). При вызове этих типов функций из метода класса необходимо задать целевой объект осей. Вы можете получить доступ к объекту осей, вызвав getAxes
способ. Этот метод возвращает объект осей, или создает Декартов объект осей, если диаграмма еще не содержит объекта осей.
Внимание
Вызов функций построения графика или функций, которые изменяют оси, без указания целевых осей, может привести к неожиданным результатам.
Когда вы вызываете функции построения графика в setup
метод, задайте временные значения (такие как NaN
) для координатных данных. Кроме того, задайте временные значения для других аргументов, которые соответствуют общественной собственности вашего класса. Это позволяет избежать установки одинаковых значений свойств в обоих setup
и update
методы.
Если вы хотите отобразить несколько примитивных объектов в осях, вызовите hold
функция между командами графического изображения. Установите состояние удержания на 'off'
после последней команды графического изображения.
Например, рассмотрим график, на которой отображаются линия и закрашенная фигура. Он имеет следующие свойства:
Две общественной собственности называются XData
и YData
для хранения x - и y - координат линии
Две частной собственности, называемые LineObject
и PatchObject
The setup
метод получает объект осей путем вызова getAxes
способ. Затем он вызывает patch
function и сохраняет выход в PatchObject
свойство. Следующая строка кода устанавливает состояние удержания осей равным 'on'
перед вызовом plot
функция для создания LineObject
свойство. Последняя строка кода устанавливает состояние удержания осей на 'off'
.
function setup(obj) % Get the axes ax = getAxes(obj); % Create Patch and Line objects obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,... 'EdgeColor','none'); hold(ax,'on') obj.LineObject = plot(ax,NaN,NaN); % Turn hold state off hold(ax,'off') end
Когда пользователь изменяет одно или несколько значений свойств объекта графика, MATLAB помечает объект графика для обновления. The update
метод запускается впервые после setup
метод запусков. Затем он запускается в следующий раз drawnow
выполняет. drawnow
функция выполняется автоматически периодически, на основе состояния графического окружения в сеансе работы с MATLAB пользователя. Таким образом, может возникнуть задержка между изменением значений свойств и наблюдением результатов этих изменений.
Используйте update
метод для перенастройки базовых графических объектов на графике на основе новых значений общественной собственности. Как правило, этот метод не различает, какой из общественной собственности изменился. Он перенастраивает все аспекты базовых графических объектов, которые зависят от общественной собственности.
Например, рассмотрим график, которая имеет следующие свойства:
Две общественной собственности называются XData
и Color
Две частной собственности, называемые LineObject
и PatchObject
The update
метод обновляет XData
и Color
свойства Line
и Patch
объекты.
function update(obj) % Update XData of line object obj.LineObject.XData = obj.XData; % Update patch XData x = obj.XData; obj.PatchObject.XData = [x x(end:-1:1)]; % Update line object colors obj.LineObject.Color = obj.Color; obj.PatchObject.FaceColor = obj.Color; end
В этом примере показано, как создать диаграмму для графического изображения линии с доверительными границами. Создайте файл определения класса с именем ConfidenceChart.m
в папке, расположенной в пути MATLAB. Определите класс путем выполнения следующих шагов.
Шаг | Реализация |
---|---|
Вывод из |
classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer |
Задайте общественную собственность. |
properties XData = NaN YData = NaN ConfidenceMargin = 0.15 MarkerSymbol = 'o' Color = [1 0 0] end |
Задайте частную собственность. |
properties(Access = private,Transient,NonCopyable)
LineObject
PatchObject
end |
Реализуйте Поверните состояние удержания осей назад к |
methods(Access = protected) function setup(obj) % get the axes ax = getAxes(obj); % Create Patch and Line objects obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,... 'EdgeColor','none'); hold(ax,'on') obj.LineObject = plot(ax,NaN,NaN); % Turn hold state off hold(ax,'off') end |
Реализуйте |
function update(obj) % Update XData and YData of Line obj.LineObject.XData = obj.XData; obj.LineObject.YData = obj.YData; % Update patch XData and YData x = obj.XData; obj.PatchObject.XData = [x x(end:-1:1)]; y = obj.YData; c = obj.ConfidenceMargin; obj.PatchObject.YData = [y+c y(end:-1:1)-c]; % Update colors obj.LineObject.Color = obj.Color; obj.PatchObject.FaceColor = obj.Color; % Update markers obj.LineObject.Marker = obj.MarkerSymbol; end end end |
Затем создайте образец графика путем вызова неявного метода конструктора с несколькими общественной собственностью:
x = 0:0.2:10; y = besselj(0,x); c = ConfidenceChart('XData',x,'YData',y,'ConfidenceMargin',0.15);
Измените цвет.
c.Color = [0 0 1];
По умолчанию образцы ваших графиков поддерживают большую часть функциональности, которая является общей для всех графиков MATLAB. Для примера, gca
и findobj
функции могут вернуть образцы из ваших графиков. Можно также передать образцы из графика в set
и get
функции, и можно настроить свойства графика в Property Inspector.
Функции, описанные в этой таблице, поддерживаются только в том случае, если они включены для вашего графика.
Функция | Описание | Дополнительная информация |
---|---|---|
Легенда | Включите | matlab.graphics.chartcontainer.mixin.Legend |
Шкала палитры | Включите | matlab.graphics.chartcontainer.mixin.Colorbar |
Различные типы осей или нескольких осей | Отображение одного или нескольких декартовых, полярных или географических графиков. | Разрабатывайте графики с полярными осями, географическими осями или несколькими осями |
функции | Включите функции, которые задают свойства на осях, такие как | Включение функций удобства для настройки свойств осей графика |
Сохранение и загрузка | Сохраните изменения после взаимодействия пользователей с графиком, чтобы они могли сохранить график и восстановить ее состояние, когда они загружают ее обратно в MATLAB. | Сохранение и загрузка образцов классов графика |