2016-07-22 63 views
-1

我想说,我对MATLAB(以及一般编程)颇为陌生,所以我希望能够明确回答!MATLAB电影图:动态数据集

我有50个左右的数据集在不同的时间拍摄(我基本上是看频谱如何随时间变化)。并非所有的时间都是相等的,也不全是整数。

我想像电影一样绘制数据以显示数据集随时间如何变化。我设法做了一个动态阴谋使用以下我删除了所有的非整数值,因为我不知道如何处理它们(请原谅任何低效或糟糕的形式):

for k = [6:1:10 12:2:20 25:25:100 500 1000 2000:2000:20000 25000:5000:40000 50000 100000:100000:400000] 
     plot(wl,sig(find(time==k),:)) 
     xlim([460 800]) 
     set(gca,'fontsize',24) 
     ylabel('\Delta T') 
     xlabel('Wavelength (nm)') 
     M(k)=getframe; 
    end 

    movie(M,3,10) 

但是,这只是让你看它在同一个图上一个接一个地绘制所有的数据集。最后,你只剩下一个有50个左右的数据集的数字,这些数据都集中在同一个数字上。这不是我想要的。我希望它一次绘制一个数据集,然后在一段时间后,数据集消失,下一个出现,看起来像一个随时间变化的整体生活数据集。 (能够以一种代表真实时间变化的方式来控制每个绘图之间的时间也是非常棒的,请注意,k值是纳秒,我希望通过一些实际的量来缩放它。我不确定这是否可能。)

我也想将文件另存为电影格式。我并不担心让MATLAB重复播放。如果有一个动态图例显示每个数据集的等待时间(k值),这也会非常有帮助。

我知道这是很多,但我会很感激任何帮助!我希望这通常会对其他人也有帮助,因为我确信动态数据集在物理科学中非常常见,并且能够以对演示文稿友好的方式表示这一点对于会谈至关重要。

提前致谢!

+1

这是一个非常宽泛的问题。如果你试图实现你想要的附加功能,你可以发布你的代码,解释发生了什么,我们可以帮助你弄清楚为什么他们不工作。我们不免费实现新功能。 –

+0

如果您在询问如何实现之前至少尝试实现您想要的功能,您将在此获得更多帮助。 –

回答

0

您需要为您创建的每个绘图创建一个句柄,然后在绘制下一个绘图之前立即调用delete()。否则,所有的平台将保持你所发现的状态。

尝试这样:

for k = [6:1:10 12:2:20 25:25:100 500 1000 2000:2000:20000 25000:5000:40000 50000 100000:100000:400000] 
    if exist currentPlot 
     delete(currentPlot); 
    currentPlot = plot(wl,sig(find(time==k),:)) 
    xlim([460 800]) 
    set(gca,'fontsize',24) 
    ylabel('\Delta T') 
    xlabel('Wavelength (nm)') 
    M(k)=getframe; 
end 

movie(M,3,10) 
0

如果你需要的是每个情节绘制下一个之前等待一下,你能做到这一点,每个循环结束前pause()。即pause(0.1)暂停0.1s,并且pause只是无限期地暂停,直到您按下一个键。

您还可以创建一个电影结构,发挥作为电影 MATLAB中如下(玩具为例)

%% 
% *Create playable Movie structure within matlab* 
X = [1:100]; 
k = 0; clear M; 
for i = 1:0.01:10 
    k = k + 1; 
    Y = sin(i * X) ./ (X/i); 
    plot(X,Y); 
    M(k) = getframe; 
end 
movie(M,1,25) % play the movie. (look at the help file for various 
         % options you can use to control the movie playback) 

您可以使用下面的技术来写一个正确的视频到一个文件。

%% 
% *Export to video file* 
Vid = VideoWriter('./output.avi'); 
open(Vid); 
X = [1:100]; 
k = 0; clear M; 
for i = 1:0.01:10 
    k = k + 1; 
    Y = sin(i * X) ./ (X/i); 
    plot(X,Y); 
    axis([0 100 -2 2]) % size of video frames must not change! 
    writeVideo(Vid,getframe); 
end 
close(Vid);