可変数のラインを表示する最適化されたチャート クラス
この例では、可変数のラインを表示するチャート クラスを最適化する方法を示します。特にラインの数が頻繁に変わらない場合は、既存の line オブジェクトを再利用するとチャートのパフォーマンスを向上させることができます。このチャートの最適化を行わない簡単なバージョンについては、ライン数が可変のチャート クラスを参照してください。
チャートには YData
行列にある列と同数のラインが表示され、局所的極値が円マーカーで示されます。下記のコードは、以下を行う方法を示したものです。
ラインとマーカー用のオブジェクトをそれぞれ格納する、
PlotLineArray
およびExtremaLine
という 2 つのプロパティを定義する。ExtremaLine
オブジェクトを初期化するsetup
メソッドを実装する。PlotLineArray
のサイズを取得し、その配列のオブジェクトをYData
の列数に応じて加算または減算するupdate
メソッドを実装する。
クラスを定義するために、次のコードをエディターにコピーし、OptimLocalExtremaChart.m
という名前で書き込み可能なフォルダーに保存します。
classdef OptimLocalExtremaChart < matlab.graphics.chartcontainer.ChartContainer % c = OptimLocalExtremaChart('XData',X,'YData',Y,Name,Value,...) % plots one line with markers at local extrema for every column of matrix Y. % You can also specify the additonal name-value arguments, 'MarkerColor' % and 'MarkerSize'. properties XData (:,1) double = NaN YData (:,:) double = NaN MarkerColor {validatecolor} = [1 0 0] MarkerSize (1,1) double = 5 end properties(Access = private,Transient,NonCopyable) PlotLineArray (:,1) matlab.graphics.chart.primitive.Line ExtremaLine (:,1) matlab.graphics.chart.primitive.Line end methods(Access = protected) function setup(obj) obj.ExtremaLine = matlab.graphics.chart.primitive.Line(... 'Parent', obj.getAxes(), 'Marker', 'o', ... 'MarkerEdgeColor', 'none', 'LineStyle',' none'); end function update(obj) % Get the axes ax = getAxes(obj); % Create extra lines as needed p = obj.PlotLineArray; nPlotLinesNeeded = size(obj.YData, 2); nPlotLinesHave = numel(p); for n = nPlotLinesHave+1:nPlotLinesNeeded p(n) = matlab.graphics.chart.primitive.Line('Parent', ax, ... 'SeriesIndex', n, 'LineWidth', 2); end % Update the lines for n = 1:nPlotLinesNeeded p(n).XData = obj.XData; p(n).YData = obj.YData(:,n); end % Delete unneeded lines delete(p((nPlotLinesNeeded+1):numel(p))) obj.PlotLineArray = p(1:nPlotLinesNeeded); % Replicate x-coordinate vectors to match size of YData newx = repmat(obj.XData(:),1,size(obj.YData,2)); % Find local minima and maxima and plot markers tfmin = islocalmin(obj.YData,1); tfmax = islocalmax(obj.YData,1); obj.ExtremaLine.XData = [newx(tfmin); newx(tfmax)]; obj.ExtremaLine.YData = [obj.YData(tfmin); obj.YData(tfmax)]; obj.ExtremaLine.MarkerFaceColor = obj.MarkerColor; obj.ExtremaLine.MarkerSize = obj.MarkerSize; % Make sure the extrema are on top uistack(obj.ExtremaLine, 'top'); end end end
クラス ファイルを保存した後は、チャートのインスタンスを作成できます。以下に例を示します。
x = linspace(0,2)'; y = cos(5*x)./(1+x.^2); c = OptimLocalExtremaChart('XData',x,'YData',y);
次に、反復ごとに追加のラインをプロットに追加する for
ループを作成します。チャート オブジェクトの既存のラインはすべて維持され、i
ごとに追加のラインが 1 つ追加されます。
for i=1:10 y = cos(5*x+i)./(1+x.^2); c.YData = [c.YData y]; end