如何在Matlab中更新散点图(在循环中)

如何在Matlab中更新散点图(在循环中),matlab,matlab-figure,point-clouds,scatter3d,Matlab,Matlab Figure,Point Clouds,Scatter3d,一个很简单的问题,但是在网上找不到答案。。。我想可视化从激光雷达收集的点云。我可以绘制各个帧,但我想循环它们来创建一个“动画”。我知道如何使用drawnow进行普通绘图,但无法使用scatter3。如果我只是像在注释代码中那样再次调用scatter3,那么我在散点图中查看的帧会随着每次更新而跳转(非常不舒服)。如何使散点3绘图更新到新点,而不更改散点的UI,即在可视化点云循环时仍然能够平移和缩放 编辑:该文件是rosbag文件,我无法附加它,因为它是170MB。当在普通数组的循环中使用scatt

一个很简单的问题,但是在网上找不到答案。。。我想可视化从激光雷达收集的点云。我可以绘制各个帧,但我想循环它们来创建一个“动画”。我知道如何使用drawnow进行普通绘图,但无法使用scatter3。如果我只是像在注释代码中那样再次调用scatter3,那么我在散点图中查看的帧会随着每次更新而跳转(非常不舒服)。如何使散点3绘图更新到新点,而不更改散点的UI,即在可视化点云循环时仍然能够平移和缩放

编辑:该文件是rosbag文件,我无法附加它,因为它是170MB。当在普通数组的循环中使用scatter3时,问题不会发生。使用scatter3调用PointCloud2类型的文件时,使用frame=readMessages(rawBag,i)

编辑:问题似乎不是轴限制,而是图形窗口中的轴视图。初始化散射后,将以正x向右侧,正y向屏幕外,正z向上的方式查看散射,如视图1所示。然后,过了一会儿,它跳转到第二个视图,其中轴发生了变化,此时正x离开屏幕,正y向右,正z向上(两个视图如图所示)。这使得不可能在循环中查看,因为它不断切换。那么基本上如何在不调用scatter3(pointCloudData)的情况下更新绘图呢




据我所知,您所描述的“跳跃式绘图”,其原因是自动调整的
x
y
z
散点3绘图的限制。您可以将
XLimMode
YLimMode
ZLimMode
行为更改为
manual
,以强制轴保持固定。不过,您必须提供初始轴限制

% Mock data, since you haven't provided a data sample
x = randn(200,50);
y = randn(200,50);
z = randn(200,50);

% Plot first frame before loop
HS = scatter3(x(:,1), y(:,1), z(:,1));
hold on

% Provide initial axes limits (adjust to your data)
xlim([-5,5])
ylim([-5,5])
zlim([-5,5])
% Set 'LimModes' to 'manual' to prevent auto resaling of the plot
set(gca, 'XLimMode', 'manual', 'YLimMode', 'manual', 'ZLimMode', 'manual')

for i=2:len(x,2)
    scatter3(x(:,i), y(:,i), z(:,i))
    pause(1)
end 

这将生成绘图的“动画”,在循环中添加连续点时,您可以平移和缩放数据。诀窍是不要在动画中使用诸如
散布
绘图
,而是修改绘图中已经存在的数据。这些函数始终重置轴属性,这就是为什么会看到视图重置。修改现有打印时,轴不受影响

函数
scatter3
(与所有打印函数一样)返回渲染打印的图形对象的句柄。对于
scatter3
,此句柄有三个相关属性:
XData
YData
ZData
。可以更新这些特性以更改点的位置:

N = 100;
data = randn(N,3) * 40;

h = scatter3(data(:,1),data(:,2),data(:,3));
for ii = 1:500
   data = data + randn(N,3);
   set(h,'XData',data(:,1),'YData',data(:,2),'ZData',data(:,3));
   drawnow
   pause(1/5)
end
新的
数据也可以完全不同,它甚至不需要包含相同数量的点

但是当修改这三个属性时,您将看到轴的
XLim
YLim
ZLim
属性发生更改。也就是说,轴将重新缩放以容纳所有数据。如果需要防止这种情况,请将轴“
XLimMode
YLimMode
ZLimMode
设置为
手动”

set(gca,'XLimMode','manual','YLimMode','manual','ZLimMode','manual')

手动设置限制时,限制模式始终设置为手动。

感谢您的回答,问题似乎不是限制。我在我的问题和2个截图中添加了更多内容。相关代码是您删除的
%更新3D散点%
下的内容。请在你的问题中包括这一点。理想情况下,您应该提供一个小数据集和完整的代码来显示问题。请参阅。不幸的是,我无法共享数据,因为它是一个170mb.bag文件。只有当使用scatter3绘制此格式的数据时,问题才会出现。。。解决我的问题的方法是,如果有一种方法可以更新绘图而不创建新绘图?请参见,以及如何在不反复绘图的情况下设置数据动画。这可能会解决内存问题,并保持您的轴没有“跳跃”。
set(gca,'XLimMode','manual','YLimMode','manual','ZLimMode','manual')