私は次のような散乱をプロットしようとしています:
scatter(coor(:, 2), coor(:, 3), 1, coor(:, 4));
問題は、プロットする座標の数が非常に多いことです(〜100 000)。プロットするのに長い時間がかかり、図をtiffにエクスポートしようとすると、matlabは数分間死んでしまいます...プロットを改善するための解決策、または少なくともtiffのエクスポートはありますか?
編集:言及するのを忘れました、3番目の座標(coor(:、4))はカラーコードです。
したがって、(上記のように)スキャッターを使用している場合、下の画像のようなものがあります。これはまさに私が見たい方法です(非常に遅いため、エクスポートできません)。
私がする時:
plot3(coor(:、2)、coor(:、3)、coor(:、4)、 '。')
効果はもうそれほどクールではありません(注:画像は同じ座標からのものではありません...):
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)
よりもはるかに優れた応答を示しますが、色解像度が高くなります(上記のコードで調整可能)。
私の経験では、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
はい、plot3を使用します
plot3(coor(:, 2), coor(:, 3), coor(:, 4), '.')
これは、3D散布図と同じように機能します(点は小さな点になります。必要に応じて'o' or 'x'
を使用することもできます)
ポイントが多すぎる場合は、データを間引くことが理にかなっている場合があります。
基本的に、2つのアプローチを行うことができます。
単純-選択するだけ-ランダムにポイントの10%を言います。
表示されないポイント、明らかに範囲外のポイントを破棄しますが、かなりの数のオーバーラップがある場合(たとえば、ポイントの直径は3pxにする必要があります)、ポイントはたとえば9pxをカバーします。私のマシンでは、あなたが投稿したようなプロットは-たとえば400x400pxになるので、最大でceil(400*400/9) < 20 000
データポイントが表示されます。
プロットをより小さなチャンクに分割することもできます-プロット1000ポイントのように、drawnow
を発行してから、完了するまで次の1000を発行します。したがって、空白の画面の前で待つ必要はありません。