座標軸プロパティを設定するための簡易関数の有効化
チャートを ChartContainer
クラスのサブクラスとして作成する際には、座標軸にプロパティを設定するために MATLAB® 簡易関数をいくつか有効にすることを検討してください。たとえば、関数 title
をサポートするようにクラスを設計することができます。簡易関数を有効にすることで、MATLAB のプロット関数と整合的なユーザー エクスペリエンスが提供されます。
異なったタイプのプロパティのサポート
簡易関数を有効にする方法は、その関数が非計算プロパティと計算プロパティのいずれを制御するかによって決まります。次の表は、サポート可能な簡易関数の一覧です。
簡易関数 | 関連する座標軸プロパティ | プロパティのタイプ |
---|---|---|
| 非計算 | |
それぞれ | 非計算 | |
それぞれ | 計算 | |
xticks , yticks , zticks | それぞれ | 計算 |
それぞれ | 計算 | |
| 計算 |
非計算プロパティ用の関数の有効化
非計算プロパティは固定値です。ユーザーまたはコードによって明示的に変更されるまで、変化することはありません。
非計算プロパティ用の簡易関数を有効にするには、制御対象の座標軸プロパティの値を格納する、ユーザー クラスのパブリック プロパティを定義します。次に、サポート対象の簡易関数と同じ名前をもち、同じ呼び出し構文をサポートするパブリック メソッドを定義します。プロパティの値を設定するコード行をメソッドに追加します。たとえば、タイトルを格納するための、TitleText
というパブリック プロパティをもつクラスについて考えます。次のコードは、このクラスの title
メソッドを示しています。
function title(obj,txt) obj.TitleText = txt; end
次に、対応する座標軸プロパティを設定するために MATLAB 簡易関数を呼び出すコード行を、update
メソッドに追加します。
title(getAxes(obj),obj.TitleText);
ここまでの手順を実行しユーザー クラス ファイルを保存したら、チャートのインスタンスを作成し、関数 title
を呼び出してタイトルを表示することができます。そうすることで、次の呼び出しシーケンスがトリガーされます。
クラスの
title
メソッドがTitleText
プロパティを設定し、これによりチャートが更新用にマークされます。drawnow
が次に実行されると、座標軸に対しupdate
メソッドが実行され、関数title
が呼び出されます。関数
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 は変更内容を一切保存しません。そのため、この例はライブ エディターではサポートされていません。ライブ エディターと、変更の保存と読み込みを伴うワークフローをサポートするには、チャート クラスのインスタンスの保存と読み込みを参照してください。
関数 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
を呼び出して、最後の 3 つのバーを拡大します。
title('Top Three Contributors')
xlim([1.5 5])