私はデータを収集し、そのデータをリアルタイムでプロットしています。データはモーションキャプチャシステムによって生成されます。新しいデータのイベント通知機能が追加された、2列の行列の単なるラッパーであるクラスが1つDynamicDataset
あります(ただし、それよりも微妙な違いがあります)。DynamicPlotter
データが追加されたイベントをリッスンし、プロットを動的に更新する別のクラス。適切なコードスニペット:
classdef DynamicDataset < handle
properties
newestData = [];
data = []
end
events
DataAdded
end
methods
function append(obj, val)
obj.data(end+1,:) = val;
obj.newestData = val;
notify(obj, 'DataAdded');
end
end
end
classdef DynamicPlotter < dynamicprops
properties
FH %# figure handle
AH %# axes handle
LH %# array of line handles - may have multiple lines on the plot
dynProps = {} %# cell array of dynamic property names -
%# use to access individual datasets
end
methods
function obj = DynamicPlotter(props) %# props is a cell array of dynamic
%# properties to store information
for i = 1:length(props)
addprop(obj, props{i});
obj.(props{i}) = DynamicDataset;
obj.dynProps = [obj.dynProps props{i}];
addlistener(obj.(props{i}), 'DataAdded', @obj.updatePlot(i));
end
obj.createBlankPlot();
end
function createBlankPlot(obj)
obj.FH = figure;
obj.AH = axes;
hold all;
for i = 1:length(obj.dynProps)
obj.LH(i) = plot(nan); %# only used to produce a line handle
set(obj.LH(i), 'XData', [], 'YData', []);
end
end
function updatePlot(obj, propNum)
X = get(obj.LH(propNum), 'XData');
Y = get(obj.LH(propNum), 'YData');
X(end+1) = obj.(dynProps{propNum}).newestData(1);
Y(end+1) = obj.(dynProps{propNum}).newestData(2);
set(obj.LH(propNum), 'XData', X, 'YData', Y);
end
end
end
MATLABコードプロファイルに基づくと、のset
コマンドupdatePlot()
はかなり高価です。個々のポイントが来たときにプロットするためのより良い方法があるかどうか疑問に思っていますか?理想的には、単一のポイントを押し込んXData
でYData
そのポイントのみを描画しますが、これが可能かどうかはわかりません。
複数の線列オブジェクト(つまり、同じプロット上に複数のグラフ)が存在する場合があることに注意してください。plot()
引数としてAxesハンドルを受け取るため、以前に描画されたラインハンドルのプロパティは考慮されません(またはそうする方法はありますか?)。私はただやろうと思っていplot(x,y);hold all;
ましたが、それは毎回別々のラインハンドルを与え、それぞれが単一のポイントに対応します。
入ってくるポイントのプロットをこれ以上速くする方法がないかもしれませんが、私は尋ねると思いました。
編集:誤解されやすい一般的な例を使用するのではなく、私が使用している実際のコードでOPを更新しました。