【问题标题】:Scatter plots with large datasets & colorbar具有大型数据集和颜色条的散点图
【发布时间】:2013-11-19 14:51:25
【问题描述】:

我有 3 个数组 x,y,c,其中 c 的每个值是 x,y 的强度,范围大约在 -3 和 3 之间

我想将每个点绘制为一个实心圆,颜色由强度c 确定。

我尝试过使用scatter(x,y,10,c),但这基本上会使我的计算机崩溃,因为数据太多。

注意每个数组包含大约 500,000 个数据点。

有没有更好的方法可以绘制这个?

【问题讨论】:

  • 您是否尝试过将其分成几块并在同一个图上分别绘制?例如:scatter(x(1:5e4),y(1:5e4),10,c(1:5e4)); hold on; scatter(x(5e4+1:10e4),y(5e4+1:10e4),10,c(5e4+1:10e4))
  • 如果即使 scatter 也不会崩溃,考虑到这么多的点,我怀疑这个情节会有所帮助。也许您应该考虑对数据进行直方图并绘制它,例如通过pcolor 在一种热图中。如果 (x,y) 对已经不同,您几乎可以直接使用 pcolor ...
  • 我在使用 Kinect 的点云时遇到了同样的问题。我使用 PCL 通过 Mex 进行渲染,或者只使用系统命令调用视图,因为我需要超过 200 万个点。

标签: matlab plot scatter-plot scatter


【解决方案1】:

我认为您的数据集太大,无法使用您描述的方法进行绘图。如果您有 50 万个数据点,并且每个“实心圆”占用 5 个像素,那么您的数据将无法适应通常的 1000x1000 全屏绘图。

给你两个想法:

(1) 如果这是您想要的行为,您必须接受您不会看到所有数据的事实,因为某些点会因为位于它们之上而阻碍其他点。使用类似的东西对数据集进行二次采样

temp = randperm(500000); temp = temp(1:10000); scatter(x(temp),y(temp),10,c(temp));

是的,这样你会丢失一些数据,但无论如何你都会因为阻塞而丢失它。这是进行快速目视检查的最简单方法。

(2) 如果您确实想查看所有数据,那么您应该考虑编写一个自定义绘图例程以满足您的需要。这是它的基本要点:

myImage = zeros(1000, 1000);
X_MIN = min(x);
Y_MIN = min(y);
X_RANGE = max(x) - min(x);
Y_RANGE = max(y) - min(y);
for idx = 1:500000
  xIndex = round( (x(idx) - X_MIN) * 999/(X_RANGE)) + 1;
  yIndex = round( (x(idx) - Y_MIN) * 999/(Y_RANGE)) + 1;
  myImage(xIndex, yIndex) = myImage(xIndex, yIndex) + c(idx);
end
imshow(myImage, []);

我没有检查过这个,所以可能存在索引错误,但你明白了。如果您经常调用它,您可能希望使用 sub2ind 对这段代码进行矢量化处理。

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2014-09-10
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多