我想通过说我对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值)也非常有用。
我知道这很多,但我真的很感激任何帮助!我希望这一般对其他人也有帮助,因为我确信动态数据集在物理科学中非常普遍,并且能够以易于呈现的方式表示这一点对谈判至关重要
提前致谢!
答案 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)
答案 1 :(得分:0)
如果您需要的是每个绘图在绘制下一个绘图之前等待一点,您可以在每个循环结束前使用pause()
执行此操作。即pause(0.1)
暂停0.1秒,而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);