17

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

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

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

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

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

分散

当我做:

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

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

在此处输入图像描述

4

4 回答 4

23

您可以使用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)给出大约相同的情节要好得多,但颜色分辨率更高(在我上面的代码中可以调整)。

于 2012-11-09T07:56:20.210 回答
1

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

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

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

这个片段创建了 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
于 2013-07-16T23:08:27.517 回答
0

是的,使用 plot3

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

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

于 2012-11-09T05:42:19.020 回答
0

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

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

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

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


您也可以尝试将情节分成更小的块 - 比如情节 1000 点,drawnow然后发出下一个 1000 直到你完成。因此,您不必在空白屏幕前等待。

于 2012-11-09T09:58:22.397 回答