如何在.avi动画中添加动态数据标签?

时间:2015-02-22 20:43:36

标签: matlab animation labels

我用" scatter3"制作了3D动画(.avi)。我有3组数据点在哪里 X,Y(均为矩阵1乘24)是固定数据点,Z是矩阵485乘24 (只有Z坐标随时间变化)。

我还使用" mesh"包括网格,其中所有数据点的z等于0。 这只是为了说明平面z = 0,因为我的数据点在-14和15之间交替。

现在我想为每个点添加动态标签(24)。我用" text" 但它根本不起作用,因为在动画期间标签被完全涂抹。 动画一个接一个地显示标签位置,但问题是动画并没有删除所有之前的标签 显示下一个标签位置。

以下是我创建动画的代码部分:

...

X=[];   % x - coordinate for each of 24 points
Y=[];   % y - coordinate    -||-
Z=[];   % z - coordinate    -||-

labels=[];  % 24 different labels

a=1:1:24;
b=1:1:24;

[aa bb]=meshgrid(a,b);

c=aa*0+bb*0;



writerObj=VideoWriter('my_animation.avi');

open(writerObj);

frames=485;

mov(1:n_frame)=struct('cdata',[],'colormap',[]);

set(gca, 'nextplot','replacechildren');

f=figure(1);
set(f,'Position',[150 80 1600 900]);

plot_1=scatter3(X,Y,Z(1,:));    % all 24 points at time t=0;
hold on;
net=mesh(a,b,c,'EdgeColor',[0 0 0],'FaceColor','none'); % grid at z=0

for k=1:frames
   set(plot_1, 'ZData',Z(k,:)); % "k" goes from 1 to 485 for all 24 points
   set(net,    'ZData');        % mesh is static all the time
   text(X,Y,Z(k,:),labels); % each point has its own label
   view(-30,50);
   mov(k)=getframe(gcf);
   writeVideo(writerObj,mov(k));
end

任何想法我怎么能解决这个问题?我试过" drawow update"和" refreshdata"在for循环中,但它没有帮助。

2 个答案:

答案 0 :(得分:0)

我认为你只需要使用findobj在当前轴中查找文本对象,并在循环继续时删除它们。我使用您的代码创建了一个用于演示目的的gif动画,但同样适用于创建.avi电影。

这是代码;我使用了伪数据并在循环中添加了对pause的调用。我也使用虚拟标签,即当前帧(我只使用10而不是485)。

我添加了

%// NEW =========

显示我添加内容的位置。

代码:

clc
clear

%// Create dummy data
X=1:24;   % x - coordinate for each of 24 points
Y=1:24;   % y - coordinate    -||-
Z=rand(10,24);   % z - coordinate    -||-

a=1:1:24;
b=1:1:24;

[aa, bb]=meshgrid(a,b);

c=aa*0+bb*0;

frames=10;

f=figure(1);
set(f,'Position',[150 80 1600 900]);

plot_1=scatter3(X,Y,Z(1,:));    % all 24 points at time t=0;

%// Moved after creating an axes. Otherwise useless figure created.
set(gca, 'nextplot','replacechildren');

hold on;
net=mesh(a,b,c,'EdgeColor',[0 0 0],'FaceColor','none'); % grid at z=0

filename = 'MyAnimation.gif';
for k=1:frames

    %// NEW =======================
    %// Use findobj to look for 
    hText = findobj('Type','text');
    delete(hText);
    %//============================


    %// NEW =======================
    Label = num2str(k);
    %//============================

    set(plot_1, 'ZData',Z(k,:)); % "k" goes from 1 to 485 for all 24 points

    text(X+.05,Y+.05,Z(k,:)+.05,Label); % each point has its own label
    view(-30,50);

    %// NEW =======================
    zlim([0 1]) %// Keep axis Z-limit constant

    %// NEW =======================
    frame = getframe(1);
      im = frame2im(frame);
      [imind,cm] = rgb2ind(im,256);
      if k == 1;
          imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
      else
          imwrite(imind,cm,filename,'gif','WriteMode','append');
      end
    %//============================


    %// NEW =======================
    pause(.2)
    %//============================
end

输出:

答案 1 :(得分:0)

我希望平面z = 0充满颜色,而不是“网格”。所以,我使用了“fill3”命令。

动画运行没有任何错误,但当我尝试在Windows媒体播放器中播放时没有任何反应。一切都是静止的。好像没有记录。

我也尝试使用你的代码(* .gif)。令人惊讶的是它有效。我不知道为什么,但确实如此。你知道重点在哪里吗?

这是我的代码:

X=[];   % x - coordinate for each of 24 points
Y=[];   % y - coordinate    -||-
Z=[];   % z - coordinate    -||-

labels=[];  % 24 different labels

% Coordinates for "fill3" 
x_1=[];
y_1=[];

z_1=[0 0 0 0]; %



writerObj=VideoWriter('my_animation.avi');

open(writerObj);

frames=485;

mov(1:n_frames)=struct('cdata',[],'colormap',[]);

f=figure(1);
set(f,'Position',[150 80 1600 900]);

set(gca, 'nextplot','replacechildren');

plot_1=scatter3(X,Y,Z(1,:));    % all 24 points at time t=0;
hold on;
fill_3=fill3(x_1,y_1,z_1,[0.8 0.8 0.8]); % plane at z=0

for k=1:frames
  lab=findobj('Type','text');
  delete(lab);
  set(plot_1, 'ZData',Z(k,:)); % "k" goes from 1 to 485 for all 24 points
  text(X,Y,Z(k,:),labels); % each point has its own label
  view(-30,50);
  mov(k)=getframe(gcf);
  writeVideo(writerObj,mov(k));
end

%Close file
close(writerObj);