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]()
Ответы
Ответ 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, пока вы не закончите. Поэтому вам не нужно ждать перед пустым экраном.