Обзор разработки диаграмм

Построение диаграммы функций такой как plot, scatter, и bar позвольте вам быстро визуализировать свои данные с основным управлением аспектами, такими как цветной и стиль линии. Чтобы создать пользовательские графики, можно объединить несколько графических объектов, установить свойства на тех объектах или вызвать дополнительные функции. В R2019a и более ранних релизах, распространенный способ сохранить ваш код индивидуальной настройки и совместно использовать его с другими состоит в том, чтобы записать скрипт или функцию.

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

  • Обеспечьте удобный интерфейс для своих пользователей — Когда пользователи хотят настроить аспект вашего графика, они могут установить свойство вместо того, чтобы иметь необходимость изменить и повторно выполнить ваш графический код. Пользователи могут изменить свойства в командной строке или смотреть их в Property Inspector.

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

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

Структура класса графика

Первая линия класса графика задает matlab.graphics.chartcontainer.ChartContainer класс как суперкласс. Например, первая линия класса под названием ConfidenceChart выглядит так:

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

В дополнение к определению суперкласса включайте следующие компоненты в свое определение класса.

КомпонентОписание

Блок общественной собственности
(рекомендуемый)

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

Блок частной собственности
(рекомендуемый)

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

В этом блоке, набор эти значения атрибута:

  • Access = private

  • Transient

  • NonCopyable

setup метод
(необходимый)

Этот метод устанавливает начальное состояние графика. Это выполняется однажды когда MATLAB® создает объект.

Задайте этот метод в защищенном блоке так, чтобы только ваш класс мог выполнить его.

update метод
(необходимый)

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

Задайте этот метод в том же защищенном блоке как setup метод.

Неявный метод конструктора

Вы не должны писать метод конструктора для своего класса, потому что конструктор наследован от 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 - координатные векторы в двух публичных свойствах. Поскольку аргументами пары "имя-значение" свойства являются дополнительные входные параметры к неявному методу конструктора, рекомендуемый подход должен инициализировать публичные свойства к значениям по умолчанию. Если вы задаете публичные свойства, которые хранят координатные значения, инициализируя их к 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  

Метод Setup

setup метод выполняется однажды, когда MATLAB создает объект диаграммы. Любые значения свойств, переданные как аргументы пары "имя-значение" методу конструктора, присвоены после того, как этот метод выполняется.

Используйте setup метод к:

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

  • Храните элементарные объекты, возвращенные функциями построения графика как частные свойства на объекте диаграммы.

  • Сконфигурируйте примитивные графические объекты.

  • Сконфигурируйте оси.

Много графических функций имеют дополнительный входной параметр для определения целевого объекта осей. Эти функции включают функции построения графика (такой как plot, scatter, и bar) и функции, которые изменяют оси (такой как hold, grid, и title). Когда вы вызываете эти типы функций из метода класса, необходимо задать целевой объект осей. Можно получить доступ к объекту осей путем вызова getAxes метод. Этот метод возвращает объект осей, или это создает объект Осей декартовой системы координат, если график уже не содержит объект осей.

Внимание

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

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

Если вы хотите отобразить несколько элементарных объектов в осях, вызовите hold функция между графическим выводом команд. Задержите состояние удержания к 'off' после вашей последней команды графического вывода.

Например, рассмотрите график, который отображает линию и закрашенную фигуру. Это имеет эти свойства:

  • Два публичных свойств под названием XData и YData для хранения x - и y - координаты линии

  • Два частных свойств под названием LineObject и PatchObject

setup метод получает объект осей путем вызова getAxes метод. Затем это вызывает patch функция и хранилища выход в 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

Метод Update

Когда пользователь изменяет одни или несколько значений свойств на объекте диаграммы, MATLAB отмечает объект диаграммы для обновления. update метод запускается впервые после setup запуски метода. Затем это запускается в следующий раз drawnow выполняется. drawnow функция автоматически периодически выполняется, на основе состояния графической среды в сеансе работы с MATLAB пользователя. Таким образом может быть задержка между изменением значений свойств и наблюдением результатов тех изменений.

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

Например, рассмотрите график, который имеет эти свойства:

  • Два публичных свойств под названием XData и Color

  • Два частных свойств под названием LineObject и PatchObject

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. Задайте класс путем выполнения этих шагов.

ШагРеализация

Выведите из ChartContainer базовый класс.

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

Реализуйте setup метод. В этом случае вызовите plot и patch функции, чтобы создать Patch и Line объекты соответственно. Храните те объекты в соответствующих частных свойствах.

Возвратите состояние удержания осей к 'off' прежде, чем выйти из метода.

    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

Реализуйте update метод. В этом случае обновите x - и y - координаты, цвет и символ маркера основных объектов.

        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 Central™.

Поддерживайте общие графические функции

По умолчанию экземпляры ваших графиков поддерживают большую часть функциональности, которая характерна для всех графиков MATLAB. Например, gca и findobj функции могут возвратить экземпляры вашего графика. Можно также передать экземпляры графика к set и get функции, и можно сконфигурировать свойства графика в Property Inspector.

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

ФункцияОписаниеБольше информации
Легенда

Включите legend функционируйте и инструмент легенды на панели инструментов фигуры.

matlab.graphics.chartcontainer.mixin.Legend
Colorbar

Включите colorbar функционируйте и инструмент шкалы палитры на панели инструментов фигуры.

matlab.graphics.chartcontainer.mixin.Colorbar
Различные типы осей или нескольких осей

Отобразите один или несколько Декартовы, полярные, или географические графики.

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

Включите функции, которые устанавливают свойства на осях, такой как title, xlim, и ylim функции.

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

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

Сохранение и загрузка экземпляров классов графика

Смотрите также

Классы

Функции

Свойства

Похожие темы