Matlab plot3 电影,其中每个点的颜色根据任意向量而变化

Matlab plot3 movie where the colour of each point varies depending on arbitrary vector

我有一组 nx6 的数据数组,其中前 3 列是轨迹的 x、y、z 坐标,n 是变化的。我在 matlab 中编写了一个脚本,它允许我连续绘制每个点,然后将其制作成电影,代码如下:

% attemt to make a movie! 
test = cou{7}(:,1:3) % data arrays are stored in larger cell arrays
numPoints = length(test(:,1))
x = test(:,1)
y = test(:,2)
z = test(:,3)
h = figure(1)
set(h,'Position',[100 678 560 420]) 

for j=1:numPoints
   plot3(test(1:j,1), test(1:j,2),test(1:j,3),'kd-')
   grid('on')
   xlim([min(x), max(x)])
   ylim([min(y), max(y)])
   zlim([min(z), max(z)])

   M(j) = getframe(h);
end

movie(M,1,30)
movie2avi(M,'testMovie2.avi')

效果很好,我得到了 .avi 格式的电影。我得到每个 < x,y,z > 坐标所在的菱形以及连接到下一个点的线。

但是,我需要根据 nx6 矩阵中的第 5 列添加不同的颜色。在第 5 列中有 0-8 的数字,每个数字都需要一种特定的颜色,因此每个新数据点都使用该列中数字唯一的颜色绘制(0 是红色,1 是蓝色等。 ).

根据我在网上阅读的所有内容,似乎我必须关闭一种颜色或将这些点拆分为:

plot3(x1,y1,z1,s1,x2,y2,z2,s2, ...)

其中 x1,y1,z1,s1 指定第一个坐标,s 定义颜色、标记和线,x2,y2,z2,s2 指定第二个点及其规格等。

最好,我可以为颜色规范定义某种矩阵 S,这样我就可以将它添加到绘图中,例如:

  plot3(x(1:j),y(1:j),z(1:j),S(1:j))

到目前为止我看到的所有相关帖子都在询问 about/answered 使用不同的 3D 绘图类型。轨迹中的点全部跳跃。所以我真的需要这种情节类型才能拍电影!

干杯, 丽莎

P.S。我意识到它不是最有效的代码,而且我现在编写它的方式可以摆脱测试数组。我下午大部分时间都在研究它,它演变成了这个。我只是想让它工作然后我会编辑它以提高效率!

可能的解决方案是:

  • 定义一个颜色索引矩阵:因为你需要 9 种颜色,所以它应该是一个 (9 x 3) 矩阵
  • 将存储在数据第 5 列中的值用于 select 颜色矩阵中的颜色(即 select 颜色矩阵的行)
  • 通过在 plot3 函数调用中指定参数“color”,为连接两点的每条线设置 selected 颜色
  • 您还可以通过设置 markerfacecolor 参数
  • 使用 selected 颜色填充点标记

为此,您必须修改循环中 "test" 数据的索引;实际上,就像现在一样,每次迭代你都在绘制 1 to j 中的所有点,而你应该从 j to j+1.

中绘制它们

因为这个修改,你还应该添加hold on.

您可以在下面的代码中找到建议的更新。

注意:

我不得不评论你代码的第一部分并添加一些指令来生成测试数据。

更重要

我在执行代码的最后一行时收到一条关于压缩因子和编解码器的警告。

Warning: Cannot locate Indeo5 compressor, using 'None' as the
compression type.

当我 运行 你的原始代码和我 运行 更新的代码时,我都收到了这个警告,因此它不应该取决于我所做的修改。

% attemt to make a movie! 
% test = cou{7}(:,1:3) % data arrays are stored in larger cell arrays
% numPoints = length(test(:,1))
% x = test(:,1)
% y = test(:,2)
% z = test(:,3)
% 
% Definition of example X, Y, Z points
% 
t=0:.3:2*pi;
x=cos(t);
y=sin(t);
z=(x.*y);
test=[x' y' z'];
numPoints = length(test)
% 
% Definition of color indeces
% 
test(:,5)=randi(9,numPoints,1);

h = figure(1)
set(h,'Position',[100 678 560 420]) 
% 
% Definiton of the set of colors
% 
line_col=[...
   0 0 1
   0 1 0
   0 1 1
   1 0 0
   1 0 1
   1 .1 .3
   .5 .5 .5
   .3 1 .3
   .7 .3 .9]

for j=1:numPoints-1
%
% Original plot instruction
% 
% % % plot3(test(1:j,1), test(1:j,2),test(1:j,3),'kd-')
% 
%    Updated plot instruction:
%       remove "k" color specification
%       specified 'color' and 'markerfacecolor' parameters
%       modified the indexig of the "test" dataset
% 
  a=plot3(test(j:j+1,1), test(j:j+1,2),test(j:j+1,3),'d-','color', ...
  line_col(test(j,5)+1,:),'markerfacecolor',line_col(test(j,5)+1,:), ...
  'linewidth',2)
   grid('on')
   xlim([min(x), max(x)])
   ylim([min(y), max(y)])
   zlim([min(z), max(z)])
% 
%    Addded "hold on" instruction, needed following the modification of the
%    indexing (see comment above)
% 
   hold on
   M(j) = getframe(h);
end

movie(M,1,30)
movie2avi(M,'testMovie2.avi')

希望这对您有所帮助。