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

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

Поддержка различных типов свойств

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

Функция удобстваСвязанное свойство осейТип свойства

title, subtitle

Title, Subtitle

Невычисленный

xlabel, ylabel, zlabel

XLabel, YLabel, и ZLabel, соответственно

Невычисленный

xlim, ylim, zlim

XLim, YLim, и ZLim, соответственно

Вычисленный

xticks, yticks, zticks

XTick, YTick, и ZTick, соответственно

Вычисленный

xticklabels, yticklabels, zticklabels

XTickLabel, YTickLabel, и ZTickLabel, соответственно

Вычисленный

view

View

Вычисленный

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

Некомпенсированные свойства являются фиксированными значениями. Они не изменяются, пока пользователь или ваш код не изменит их явным образом.

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

function title(obj,txt) 
       obj.TitleText = txt;
end

Далее добавьте строку кода к update метод, который вызывает функцию удобства MATLAB, чтобы задать соответствующее свойство осей.

title(getAxes(obj),obj.TitleText);

После выполнения предыдущих шагов и сохранения файла класса можно создать образец своего графика и вызвать title функция для отображения заголовка. Это запускает эту последовательность вызовов:

  1. The title метод в классе устанавливает TitleText свойство, которое помечает график для обновления.

  2. В следующий раз drawnow выполняет, update метод выполняет и вызывает title функция на осях.

  3. title функция обновляет Title свойство на осях.

Включите функции для вычисляемых свойств

Вычисленные свойства управляются осями. Оси пересчитывают свои значения в зависимости от содержимого осей и базовых данных.

Чтобы включить функцию удобства для вычисляемого свойства, задайте метод, который имеет то же имя и синтаксис вызова, что и функция удобства, которую вы хотите включить. Внутри этого метода вызовите функцию удобства и укажите оси в качестве первого аргумента. Для примера, чтобы включить xlim function, задайте метод, вызываемый xlim в вашем классе. Начиная с xlim функция принимает переменное число входных параметров, вы должны задать varargin как второй входной параметр. xlim функция также поддерживает переменное количество выходных аргументов, поэтому необходимо задать [varargout{1:nargout}] для поддержки этих аргументов.

function varargout = xlim(obj,varargin) 
    ax = getAxes(obj);
    [varargout{1:nargout}] = xlim(ax,varargin{:});
end

Чтобы предоставить доступ к соответствующим значениям свойств на графике, задайте два зависимых свойства от вашего класса. Первое свойство предоставляет доступ к значению, которым управляет функция удобства. Другое свойство предоставляет доступ к свойству mode, которое указывает, как управляется первое свойство. Свойство mode может иметь значение 'auto' или 'manual'. Задайте эти свойства как зависимые, чтобы график не хранила значения. Эти оси управляют и хранит эти значения. Например, чтобы предоставить доступ к XLim и XLimMode свойства на осях задают пару зависимых свойств, называемых XLimits и XLimitsMode.

properties (Dependent)
    XLimits (1,2) double
    XLimitsMode {mustBeMember(XLimitsMode,{'auto','manual'})}
end

Далее задайте set и get методы для каждого зависимого свойства. В каждом методе задайте соответствующее свойство осей. Следующий код показывает set методы и get методы для XLimits и XLimitsMode свойства.

function set.XLimits(obj,xlm)
    ax = getAxes(obj);
    ax.XLim = xlm;
end
function xlm = get.XLimits(obj)
    ax = getAxes(obj);
    xlm = ax.XLim;
end
function set.XLimitsMode(obj,xlmmode)
    ax = getAxes(obj);
    ax.XLimMode = xlmmode;
end
function xlm = get.XLimitsMode(obj)
    ax = getAxes(obj);
    xlm = ax.XLimMode;
end

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

Примечание

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

Класс графика, поддерживающий title, xlim, и ylim Функции

В этом примере показано, как определить класс графиков, который поддерживает title, xlim, и ylim функций. Следующий код демонстрирует, как:

  • Задайте TitleText свойство и реализация title метод, чтобы образцы графика поддерживали title функция.

  • Реализуйте xlim и ylim методы, чтобы образцы графика поддерживали xlim и ylim функций.

  • Задайте свойства, которые позволяют пользователю получить и задать пределы по оси X и ось Y

  • Объедините Bar и ErrorBar объекты в один график.

Чтобы определить класс, скопируйте этот код в редактор и сохраните его с именем BarErrorBarChart.m в папке с возможностью записи.

classdef BarErrorBarChart < matlab.graphics.chartcontainer.ChartContainer
    properties
        XData (1,:) double = NaN
        YData (1,:) double = NaN
        EData (1,:) double = NaN
        TitleText (:,:) char = ''
    end
    properties (Dependent)
        % Provide properties to support setting & getting
        XLimits (1,2) double
        XLimitsMode {mustBeMember(XLimitsMode,{'auto','manual'})}
        YLimits (1,2) double
        YLimitsMode {mustBeMember(YLimitsMode,{'auto','manual'})}
    end
    properties (Access = private)
        BarObject (1,1) matlab.graphics.chart.primitive.Bar
        ErrorBarObject (1,1) matlab.graphics.chart.primitive.ErrorBar
    end
    
    methods(Access = protected)
        function setup(obj)
            ax = getAxes(obj);
            obj.BarObject = bar(ax,NaN,NaN);
            hold(ax,'on')
            obj.ErrorBarObject = errorbar(ax,NaN,NaN,NaN);
            obj.ErrorBarObject.LineStyle = 'none';
            obj.ErrorBarObject.LineWidth = 2;
            obj.ErrorBarObject.Color = [0.6 0.7 1];
            hold(ax,'off');
        end
        function update(obj)
            % Update Bar and ErrorBar XData and YData
            obj.BarObject.XData = obj.XData;
            obj.BarObject.YData = obj.YData;
            obj.ErrorBarObject.XData = obj.XData;
            obj.ErrorBarObject.YData = obj.YData;
            
            % Update ErrorBar delta values
            obj.ErrorBarObject.YNegativeDelta = obj.EData;
            obj.ErrorBarObject.YPositiveDelta = obj.EData;
            
            % Update axes title
            ax = getAxes(obj);
            title(ax,obj.TitleText);
        end
    end
    
    methods
        % xlim method
        function varargout = xlim(obj,varargin)
            ax = getAxes(obj);
            [varargout{1:nargout}] = xlim(ax,varargin{:});
        end
        % ylim method
        function varargout = ylim(obj,varargin)
            ax = getAxes(obj);
            [varargout{1:nargout}] = ylim(ax,varargin{:});
        end
        % title method
        function title(obj,txt)
            obj.TitleText = txt;
        end
        
        % set and get methods for XLimits and XLimitsMode
        function set.XLimits(obj,xlm)
            ax = getAxes(obj);
            ax.XLim = xlm;
        end
        function xlm = get.XLimits(obj)
            ax = getAxes(obj);
            xlm = ax.XLim;
        end
        function set.XLimitsMode(obj,xlmmode)
            ax = getAxes(obj);
            ax.XLimMode = xlmmode;
        end
        function xlm = get.XLimitsMode(obj)
            ax = getAxes(obj);
            xlm = ax.XLimMode;
        end
        
        % set and get methods for YLimits and YLimitsMode
        function set.YLimits(obj,ylm)
            ax = getAxes(obj);
            ax.YLim = ylm;
        end
        function ylm = get.YLimits(obj)
            ax = getAxes(obj);
            ylm = ax.YLim;
        end
        function set.YLimitsMode(obj,ylmmode)
            ax = getAxes(obj);
            ax.YLimMode = ylmmode;
        end
        function ylm = get.YLimitsMode(obj)
            ax = getAxes(obj);
            ylm = ax.YLimMode;
        end
    end
end

После сохранения BarErrorBarChart.m, создайте образец графика.

BarErrorBarChart('XData',[1 2 3 4],'YData',[11 22 31 41],'EData',[2 2 2 2]);

Укажите заголовок путем вызова title функция. Затем увеличьте изображение последних трех полос, позвонив в xlim функция.

title('Top Three Contributors')
xlim([1.5 5])

См. также

Классы

Функции

Свойства

Похожие темы