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

How to add dynamic data labels inside of .avi animation?

我用 "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

有什么办法可以解决这个问题吗?我尝试在 for 循环中使用 "drawnow update" 和 "refreshdata",但没有用。

我认为您只需要使用 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

并输出:

而不是 "mesh" 我想让平面 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);