2012-11-09 35 views
17

Próbuję wykres punktowy, coś jak:MATLAB: Wykresy rozrzutu z dużą liczbą punktów danych

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

Problem polega na tym, że mam dość dużą liczbę współrzędnych do terenu (~ 100 000). Jego zajęcie zajmuje dużo czasu, a kiedy próbuję wyeksportować figurę do tiff - wtedy matlab jest martwy dla goooood kilka minut ... Jakieś rozwiązanie, aby poprawić spisek, lub co najmniej tiff export?

EDYCJA: Nie pamiętam, trzecia współrzędna (coor (:, 4)) jest kodem koloru.

Tak więc, gdy używam rozpraszania (jak wyżej), mam coś jak na poniższym obrazku, i dokładnie to, jak chcę to zobaczyć (tylko super wolny i nie mogę tego eksportować):

scatter

Podczas czynności:

Plot3 (COOR (:, 2) COOR (:, 3) COOR (:, 4), '')

Efekt

nie jest tak fajny ny więcej (uwaga: zdjęcia nie są z tych samych współrzędnych ...):

enter image description here

+0

Czy ktoś wie, jak rozwiązać ten problem, dzieląc dane na piksele, a następnie wyświetlając je jako obraz? – Anael

Odpowiedz

23

Możesz użyć plot, ale wszystkie punkty mają ten sam kolor. Można jednak podzielić zestaw w różnych podgrupach i wykreślić je każdy z własnym kolorze:

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

który reaguje już dużo lepiej niż scatter(x,y,1,C) co daje o tej samej działce, ale z wyższym kolorem rozdzielczość (która jest regulowana w powyższym kodzie).

+0

+1. Używam tego podejścia dość często, nawet napisałem prostą metodę, aby to zrobić łatwiej (chociaż dane, które często pozwalam na łatwiejsze rozdzielenie na kilka odrębnych grup). –

+0

bardzo inteligentne rozwiązanie. Dzięki! – Art

0

Tak, stosowanie Plot3

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

to zrobi to samo jako 3d wykres punktowy (punkty będą małe kropki, możesz także użyć 'o' or 'x', jeśli chcesz)

+0

Dzięki za zainteresowanie, jednak nie rozwiązuje to mojego problemu, zobacz EDYCJA powyżej ... – Art

+0

Niestety, nie wiem jak używać plot3 do zmiany koloru –

0

Jeśli masz za dużo punktów, może być przydatne ich zmniejszenie.

Zasadniczo można zrobić dwa podejścia:

  1. prosta - wystarczy wybrać - powiedzmy 10% punktów losowo.

  2. punkty odrzutów, które nie byłyby widoczne, oczywiście tych spoza zakresu, ale także, jeśli masz, że wiele sporo pokrywają się - mówią punkt należy 3PX średnicy - tak punkt obejmowałby powiedzieć 9PX. Na mojej maszynie działka taka jak ty wysłana byłaby - powiedzmy 400x400px, więc najwyżej ceil(400*400/9) < 20 000 punktów danych byłoby widoczne.


można także spróbować oddzielić działkę na mniejsze kawałki - jak działka 1000 punktów, następnie wystawia drawnow następny 1000 aż skończysz.Nie musisz więc czekać przed pustym ekranem.

1

Z doświadczenia wiem, że najbardziej wydajnym poleceniem w matlab jest Patch, a ja użyłem go do emulowania funkcjonalności rozproszenia lub scatter3 z dużo większą wydajnością.

Jeśli masz listę punktów, użyj każdego punktu, aby zdefiniować kwadratową łatę (lub ośmiokąty, lub cokolwiek innego) o rozsądnej długości krawędzi dla konkretnych danych, a następnie narysuj kolekcję łat za pomocą jednego połączenia do poprawki. Po utworzeniu obiektu graficznego można aktualizować jego dane koloru, aby indywidualnie pokolorować kwadraty.

Możesz użyć tej samej koncepcji w 3D, budując kostki lub krzyże 3D z zestawu danych.

Ten fragment tworzy 1e5 losowo rozmieszczonych kwadratów, z przypadkowymi kolorami w tym przypadku i działa w mniej niż sekundę na moim czteroletnim laptopie. Podobne wezwanie do rozproszenia zajmuje 40 sekund i zwraca nieporęczną postać, która jest trudna do manipulowania.

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