2016-03-22 15 views
3

できるだけ速く複数のデータライン/曲線を持つプロットを更新したい。複数のデータライン/曲線を持つMatlab更新プロット

h = plot(x,y); 
set(h,'YDataSource','y') 
set(h,'XDataSource','x') 
refreshdata(h,'caller'); 

または

set(h,'XData',x,'YData',y); 

を、それは素晴らしい作品単一の曲線のために、しかし、私は1つが、複数のデータ曲線だけでなく、更新したい:私は使用してのようなプロットを更新するためのいくつかの方法を見てきました。これどうやってするの?

+2

あなたは 'Nx2'行列であることを 'X'を設定しようとしたことがありますか? –

+0

'drawnow'関数を使うことができます。 – obchardon

+0

返信@Ander Biguriありがとう。私は次のコードを試してみましたが、2D配列ではなくベクトルのみを許可するようです。 'x(:、1)=(1:10); x(:、2)=(1:10); y(:、1)= 2 * x(:、1); y(:、2)= 5 * x(:、2); h = plot(x、y); %x、yに新しいデータを与えます。 セット(d1、 'XData'、x、 'YData'、y); ==>を使用するとエラーが発生します。値は列または行ベクトルでなければなりません。 " – bienle

答えて

5

plotコマンドで複数のプロットオブジェクトを作成する場合、plotが返すハンドルは実際にはan array of plot objects(プロットごとに1つ)です。このため

plots = plot(rand(2)); 
size(plots) 

    1 2 

、あなたはは単にXDataに別の[2×2]行列を割り当てることはできません。

set(plots, 'XData', rand(2)) 

あなた次の構文を経由してプロットに新しいのXDataのセル配列を渡すことができます。これは、すでにセル配列に新しい値がある場合にのみ便利です。

set(plots, {'XData'}, {rand(1,2); rand(1,2)}) 

その他のオプションは、各プロットオブジェクトを個別に新しい値で更新することです。これをすばやく実行する限り、MATLABがアイドル状態になるか、明示的にdrawnowを呼び出すまで実際にレンダリングされないため、すべてを一度に設定しないとパフォーマンスが大幅に低下しません。

X = rand(2); 
Y = rand(2); 

for k = 1:numel(plots) 
    set(plots(k), 'XData', X(k,:), 'YData', Y(k,:)) 
end 

% Force the rendering *after* you update all data 
drawnow 

あなたは本当にあなたが示されているXDataSourceYDataSource方法を使用する場合は、あなたが実際にこれを行うことができますが、プロットオブジェクトの一意のデータソースを指定する必要があります。

% Do this when you create the plots 
for k = 1:numel(plots) 
    set(plots(k), 'XDataSource', sprintf('X(%d,:)', k), ... 
        'YDataSource', sprintf('Y(%d,:)', k)) 
end 

% Now update the plot data 
X = rand(2); 
Y = rand(2); 

refreshdata(plots) 
1

あなたはdrawnowを使用することができます。

%Creation of the vectors 

x = 1:100; 
y = rand(1,100); 

%1st plot 
h = plot(x,y); 

pause(2); 

%update y 
y = rand(1,100); 
set(h,'YData',y) 
%update the plot. 
drawnow 
関連する問題