Main Content

座標軸プロパティを設定するための簡易関数の有効化

チャートを ChartContainer クラスのサブクラスとして作成する際には、座標軸にプロパティを設定するために MATLAB® 簡易関数をいくつか有効にすることを検討してください。たとえば、関数 title をサポートするようにクラスを設計することができます。簡易関数を有効にすることで、MATLAB のプロット関数と整合的なユーザー エクスペリエンスが提供されます。

異なったタイプのプロパティのサポート

簡易関数を有効にする方法は、その関数が非計算プロパティと計算プロパティのいずれを制御するかによって決まります。次の表は、サポート可能な簡易関数の一覧です。

簡易関数関連する座標軸プロパティプロパティのタイプ

title, subtitle

Title, Subtitle

非計算

xlabel, ylabel, zlabel

それぞれ XLabelYLabel、および ZLabel

非計算

xlim, ylim, zlim

それぞれ XLimYLim、および ZLim

計算

xticks, yticks, zticks

それぞれ XTickYTick、および ZTick

計算

xticklabels, yticklabels, zticklabels

それぞれ XTickLabelYTickLabel、および ZTickLabel

計算

view

View

計算

非計算プロパティ用の関数の有効化

非計算プロパティは固定値です。ユーザーまたはコードによって明示的に変更されるまで、変化することはありません。

非計算プロパティ用の簡易関数を有効にするには、制御対象の座標軸プロパティの値を格納する、ユーザー クラスのパブリック プロパティを定義します。次に、サポート対象の簡易関数と同じ名前をもち、同じ呼び出し構文をサポートするパブリック メソッドを定義します。プロパティの値を設定するコード行をメソッドに追加します。たとえば、タイトルを格納するための、TitleText というパブリック プロパティをもつクラスについて考えます。次のコードは、このクラスの title メソッドを示しています。

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

次に、対応する座標軸プロパティを設定するために MATLAB 簡易関数を呼び出すコード行を、update メソッドに追加します。

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

ここまでの手順を実行しユーザー クラス ファイルを保存したら、チャートのインスタンスを作成し、関数 title を呼び出してタイトルを表示することができます。そうすることで、次の呼び出しシーケンスがトリガーされます。

  1. クラスの title メソッドが TitleText プロパティを設定し、これによりチャートが更新用にマークされます。

  2. drawnow が次に実行されると、座標軸に対し update メソッドが実行され、関数 title が呼び出されます。

  3. 関数 title によって座標軸の Title プロパティが更新されます。

計算プロパティ用の関数の有効化

計算プロパティは座標軸によって制御されます。座標軸は、座標軸の内容および基となるデータに応じてその値を再計算します。

計算プロパティ用の簡易関数を有効にするには、有効にする簡易関数と同じ名前と呼び出し構文をもつメソッドを定義します。そのメソッド内で、簡易関数を呼び出して、座標軸を最初の引数として指定します。たとえば、関数 xlim を有効にするには、ユーザー クラスに xlim というメソッドを定義します。関数 xlim は可変数の入力引数を受け入れるため、varargin を 2 番目の入力引数として指定しなければなりません。関数 xlim はまた、可変数の出力引数もサポートするため、[varargout{1:nargout}] を指定してそれらの引数をサポートしなければなりません。

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

チャート上の対応するプロパティ値へのアクセスを提供するには、ユーザー クラスに 2 つの依存プロパティを定義します。最初のプロパティは、簡易関数が制御する値へのアクセスを提供します。もう一方のプロパティは、最初のプロパティがどのように制御されるかを指定する、モード プロパティへのアクセスを提供します。モード プロパティは、'auto' または 'manual' の値を取ることができます。チャートが値を格納しないように、これらを依存プロパティとして定義します。座標軸がこれらの値を制御し格納します。たとえば、座標軸で XLim プロパティと XLimMode プロパティへのアクセスを提供するには、XLimits および XLimitsMode という依存プロパティのペアを定義します。

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

次に、それぞれの依存プロパティに set メソッドと get メソッドを定義します。各メソッド内に、対応する座標軸プロパティを設定します。以下のコードは、XLimits プロパティと XLimitsMode プロパティの set メソッドと get メソッドを示しています。

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 プロパティが更新されます。

メモ

既定では、ユーザーが関数 xlim と関数 ylim を呼び出すとき、MATLAB は変更内容を一切保存しません。ユーザーがチャートを保存し読み込む際のこうした変更の保持をサポートするには、チャート クラスのインスタンスの保存と読み込みを参照してください。

関数 titlexlimylim をサポートするチャート クラス

この例では、関数 titlexlim、および 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 を呼び出して、最後の 3 つのバーを拡大します。

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

参考

クラス

関数

プロパティ

関連するトピック