如何在 .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);
我用 "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);