Подтвердить что ты не робот

Matlab: разброс графиков с большим количеством данных

Я пытаюсь построить разброс, что-то вроде:

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

Проблема заключается в том, что у меня довольно большое количество координат для построения (~ 100 000). Это займет много времени, чтобы запечатлеть его, и когда я пытаюсь экспортировать фигуру в tiff - тогда Matlab мертв для goooood несколько минут... Любое решение для улучшения печати или, по крайней мере, экспорта tiff?

EDIT: Забыл упомянуть, 3-я координата (coor (:, 4)) - это цветовой код.

Итак, когда я использую разброс (как указано выше), у меня есть что-то похожее на изображении ниже, и именно так я хочу его видеть (просто его слишком медленно, и я не могу его экспортировать):

scatter

Когда я это сделаю:

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

Эффект

уже не так крут (обратите внимание: изображения не из тех же координат...):

enter image description here

4b9b3361

Ответ 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

enter image description here

который отвечает намного лучше, чем scatter(x,y,1,C), который дает примерно тот же сюжет, но с более высоким цветовым разрешением (которое настраивается в моем коде выше).

Ответ 2

Мой опыт в том, что наиболее эффективной командой построения в Matlab является Patch, и я использовал ее для эмуляции функций разброса или рассеяния3 с гораздо более высокой эффективностью.

Если у вас есть список точек, используйте каждую точку, чтобы определить квадратный патч (или восьмиугольники или что-то еще) разумной длины края для ваших конкретных данных, а затем нарисуйте коллекцию патчей с помощью одного вызова патча. После создания графического объекта вы можете обновлять свои цветовые данные, чтобы индивидуально покрасить квадраты.

Вы можете использовать ту же концепцию в 3D, создав кубы или 3D-крестики из вашего набора данных.

Этот фрагмент создает 1e5 случайно размещенных квадратов со случайными цветами в этом случае и работает чуть меньше секунды на моем четырехлетнем ноутбуке. Аналогичный вызов разброса занимает 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', если хотите)

Ответ 4

Если у вас слишком много точек, имеет смысл уменьшить данные.

В принципе, вы можете сделать два подхода:

  • просто - просто выберите - скажем, 10% точек в случайном порядке.

  • отбросить точки, которые не будут видны, очевидно, вне пределов вашего диапазона, но также, если у вас есть много много перекрытий - скажем, что точка должна быть 3px в диаметре, поэтому точка будет охватывать 9px. На моей машине такой сюжет, как вы выложили, будет - скажем, 400x400px, поэтому не более ceil(400*400/9) < 20 000 будут отображаться точки данных.


вы также можете попытаться отделить сюжет на более мелкие куски - например, за 1000 очков, выдать drawnow, а затем следующие 1000, пока вы не закончите. Поэтому вам не нужно ждать перед пустым экраном.