exponenta event banner

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

При разработке диаграммы как подкласса 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

Вычисленный

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы включить функцию удобства для вычисляемого свойства, определите метод, который имеет то же имя и синтаксис вызова, что и функция удобства, которую необходимо включить. Внутри этого метода вызовите функцию удобства и укажите оси в качестве первого аргумента. Например, для включения xlim функция, определите метод, вызываемый 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 на диаграмме. 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])

См. также

Классы

Функции

Свойства

Связанные темы