Обзор разработки графика

Функции построения графиков, такие как 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 - 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   

Метод Setup

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

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

Вывод из 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. Для примера, gca и findobj функции могут вернуть образцы из ваших графиков. Можно также передать образцы из графика в set и get функции, и можно настроить свойства графика в Property Inspector.

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

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

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

matlab.graphics.chartcontainer.mixin.Legend
Шкала палитры

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

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

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

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

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

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

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

Сохранение и загрузка образцов классов графика

См. также

Классы

Функции

Свойства

Похожие темы