matlab: точечные диаграммы с большим количеством точек данных
Я пытаюсь построить разброс, что-то вроде:
scatter(coor(:, 2), coor(:, 3), 1, coor(:, 4));
проблема в том, что у меня довольно большое количество координат для построения (~100 000). Его занимает много времени, чтобы построить его, и когда я пытаюсь экспортировать фигуру в tiff - тогда matlab мертв для goooood несколько минут... Любое решение для улучшения построения графика или, по крайней мере, экспорта tiff?
изменить: Забыл упомянуть, 3-я координата (coor (:, 4)) - это цветовой код.
Итак, когда я использую scatter (как указано выше), у меня есть что-то вроде изображения ниже, и именно так я хочу его видеть (просто его супер медленный, и я не могу экспортировать это):
когда я делаю:
plot3 (coor (:, 2), coor (:, 3), coor (:, 4), '.')
эффект уже не так крут (Примечание: изображения не из тех же координат...) :
4 ответов
можно использовать участка, но тогда все точки имеют один и тот же цвет. Тем не менее, вы можете разделить набор в разных подмножествах и построить их каждый со своим собственным цветом:
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 с гораздо большей эффективностью.
Если у вас есть список точек, используйте каждую точку для определения квадратного патча (или восьмиугольников или чего-либо еще) разумной длины края для ваших конкретных данных, а затем постройте коллекцию патчей с одним вызовом патча. После создания графического объекта можно обновить его цветовые данные до индивидуально раскрасьте квадраты.
вы можете использовать ту же концепцию в 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
да, используйте plot3
plot3(coor(:, 2), coor(:, 3), coor(:, 4), '.')
это будет делать то же самое, что и 3D-График разброса (точки будут маленькими точками, вы также можете использовать 'o' or 'x'
Если вы хотите)
Если у вас слишком много точек, возможно, имеет смысл уменьшить данные.
в основном вы могли бы сделать два подхода:
просто - выберите - скажем 10% точек случайным образом.
отбросить точки, которые не будут видны, очевидно, те, которые находятся вне вашего диапазона, но также, если у вас есть, что многие довольно много перекрываются - скажем, точка должна быть 3px в диаметре - так что точка будет охватывать, скажем, 9px. На моем автоответчике сюжет вроде твоего. было бы-скажем 400x400px так самое большее
ceil(400*400/9) < 20 000
точки данных будут видны.
вы также можете попытаться разделить участок на более мелкие куски-например, участок 1000 точек, выдать drawnow
затем следующая 1000, пока вы не закончите. Так что вам не придется ждать перед пустым экраном.