web-dev-qa-db-ja.com

matlab:データポイントの数が多い散布図

私は次のような散乱をプロットしようとしています:

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

問題は、プロットする座標の数が非常に多いことです(〜100 000)。プロットするのに長い時間がかかり、図をtiffにエクスポートしようとすると、matlabは数分間死んでしまいます...プロットを改善するための解決策、または少なくともtiffのエクスポートはありますか?

編集:言及するのを忘れました、3番目の座標(coor(:、4))はカラーコードです。

したがって、(上記のように)スキャッターを使用している場合、下の画像のようなものがあります。これはまさに私が見たい方法です(非常に遅いため、エクスポートできません)。

scatter

私がする時:

plot3(coor(:、2)、coor(:、3)、coor(:、4)、 '。')

効果はもうそれほどクールではありません(注:画像は同じ座標からのものではありません...):

enter image description here

17
Art

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
_

enter image description here

これは、ほぼ同じプロットを提供するscatter(x,y,1,C)よりもはるかに優れた応答を示しますが、色解像度が高くなります(上記のコードで調整可能)。

23
Gunther Struyf

私の経験では、matlabで最も効率的なプロットコマンドはPatchであり、これを使用して、scatterまたはscatter3の機能をはるかに高い効率でエミュレートしました。

ポイントのリストがある場合は、各ポイントを使用して、特定のデータに適したエッジ長の正方形パッチ(または八角形など)を定義し、パッチを1回呼び出すだけでパッチのコレクションをプロットします。グラフィックオブジェクトが作成されたら、そのカラーデータを更新して、正方形に個別に色を付けることができます。

データセットからキューブまたは3Dクロスを作成することにより、3Dで同じ概念を使用できます。

このスニペットは、ランダムに配置された1e5の正方形を作成します。この場合はランダムな色で、4年前のラップトップで1秒弱で実行されます。同様のスキャッターの呼び出しには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
1
Jon Rankin

はい、plot3を使用します

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

これは、3D散布図と同じように機能します(点は小さな点になります。必要に応じて'o' or 'x'を使用することもできます)

0

ポイントが多すぎる場合は、データを間引くことが理にかなっている場合があります。

基本的に、2つのアプローチを行うことができます。

  1. 単純-選択するだけ-ランダムにポイントの10%を言います。

  2. 表示されないポイント、明らかに範囲外のポイントを破棄しますが、かなりの数のオーバーラップがある場合(たとえば、ポイントの直径は3pxにする必要があります)、ポイントはたとえば9pxをカバーします。私のマシンでは、あなたが投稿したようなプロットは-たとえば400x400pxになるので、最大でceil(400*400/9) < 20 000データポイントが表示されます。


プロットをより小さなチャンクに分割することもできます-プロット1000ポイントのように、drawnowを発行してから、完了するまで次の1000を発行します。したがって、空白の画面の前で待つ必要はありません。

0
bdecaf