【问题标题】:matlab: scatter plots with high number of datapointsmatlab:具有大量数据点的散点图
【发布时间】:2012-10-29 10:49:45
【问题描述】:

我正在尝试绘制散点图,例如:

scatter(coor(:, 2), coor(:, 3), 1, coor(:, 4));

问题是,我有相当多的坐标要绘制(~100 000)。绘制它需要很长时间,当我尝试将图形导出到 tiff 时,matlab 已经死了几分钟......有什么解决方案可以改善绘图,或者至少是 tiff 导出?

编辑: 忘了说,第三个坐标 (coor(:, 4)) 是一个颜色代码。

所以,当我使用 scatter(如上)时,我在下图中有类似的东西,这正是我想要看到的(只是它超级慢,我无法导出):

当我这样做时:

plot3(coor(:, 2), coor(:, 3), coor(:, 4), '.')

效果不再那么酷了(注意:图像不是来自同一个坐标...):

【问题讨论】:

  • 有谁知道如何通过将数据合并为像素,然后将其显示为图像来解决这个问题?

标签: matlab plot figure scatter


【解决方案1】:

您可以使用plot,但所有点的颜色都相同。但是,您可以将集合划分为不同的子集,并用自己的颜色绘制它们:

N = 100000;
x = rand(N,1);
y = rand(N,1);
C = sin(2*x)+y;

cdivs = 10;
[~, edges] = hist(C,cdivs-1);
edges = [-Inf edges Inf]; % to include all points
[Nk, bink] = histc(C,edges);

figure;
hold on;
cmap = jet(cdivs);
for ii=1:cdivs
    idx = bink==ii;
    plot(x(idx),y(idx),'.','MarkerSize',4,'Color',cmap(ii,:));
end

colormap(cmap)
caxis([min(C) max(C)])
colorbar

它的响应已经比 scatter(x,y,1,C) 好得多,它给出了大致相同的情节,但颜色分辨率更高(在我上面的代码中可以调整)。

【讨论】:

  • +1。我经常使用这种方法,所以我什至写了一个简单的方法来更容易地做到这一点(尽管我拥有的数据通常可以更容易地分成几个不同的组)。
  • 非常聪明的解决方案。谢谢!
【解决方案2】:

我的经验是,matlab 中最有效的绘图命令是 Patch,我用它来模拟 scatter 或 scatter3 的功能,效率要高得多。

如果您有一个点列表,请使用每个点为您的特定数据定义一个具有合理边长的正方形补丁(或八边形,或其他任何东西),然后通过一次调用补丁来绘制补丁集合。创建图形对象后,您可以更新其颜色数据以单独为正方形着色。

您可以通过从数据集中构建立方体或 3D 十字在 3D 中使用相同的概念。

这个 sn-p 创建 1e5 个随机放置的正方形,在这种情况下具有随机颜色,并且在我四岁的笔记本电脑上运行不到一秒钟。对 scatter 的类似调用需要 40 秒,并返回一个难以操作的笨重图形。

tic
P=rand(1e5,2);
Edge=.01;
X=[P(:,1)'; P(:,1)'+Edge; P(:,1)'+Edge; P(:,1)'];
Y=[P(:,2)'; P(:,2)'; P(:,2)'+Edge; P(:,2)'+Edge];
figure;
h=patch(X,Y,'r');
set(h,'facevertexcdata',rand(size(X,2),3),'facecolor','flat','edgecolor','none')
drawnow
toc

【讨论】:

    【解决方案3】:

    是的,使用 plot3

    plot3(coor(:, 2), coor(:, 3), coor(:, 4), '.')
    

    这将与 3d 散点图相同(点将是小点,如果需要,您也可以使用 'o' or 'x'

    【讨论】:

    • 感谢您的关注,但它不能解决我的问题,请参阅上面的编辑...
    • 是的,不幸的是我不知道如何使用 plot3 来改变颜色
    【解决方案4】:

    如果你有太多的点,精简数据可能是有意义的。

    基本上你可以做两种方法:

    1. 简单 - 只需选择 - 随机说 10% 的点。

    2. 丢弃不可见的点,显然是那些超出你的范围的点,但如果你有很多重叠的点——比如一个点的直径应该是 3px——所以一个点会覆盖 9px。在我的机器上,像您发布的图将是 - 比如说 400x400px,所以最多 ceil(400*400/9) < 20 000 数据点将是可见的。


    您也可以尝试将绘图分成更小的块 - 例如绘制 1000 个点,发出 drawnow 然后下一个 1000 直到您完成。所以您不必在空白屏幕前等待。

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      相关资源
      最近更新 更多