2013-08-26 13 views
7

Używam funkcji hist3() do wykreślania gęstości punktów. Tworzy siatkę i znajduje liczbę punktów w każdej siatce, a następnie tworzy wykres. Ale kolory na działce są dyskretne. Czy istnieje opcja, aby sprawić, że rozkład będzie płynny, tzn. Sprawi, że przejście z jednego koloru na drugi będzie bardziej płynne. Teraz wszystkie komórki siatki mają różne kolory, od uśmiechu do żółtego, a rozkład nie jest widoczny.Czy możliwe jest wygładzenie wykresów hist3?

Używam następującego kodu.

axis equal; 
colormap(jet); 
n = hist3(final',[40,40]); 
n1 = n'; 
n1(size(n,1) + 1 ,size(n,2) + 1) = 0; 
xb = linspace(min(final(:,1)),max(final(:,1)),size(n,1)+1); 
yb = linspace(min(final(:,2)),max(final(:,2)),size(n,1)+1); 
pcolor(xb,yb,n1); 

Z góry dziękuję.

+1

Zapoznaj się z [ 'colormap()'] (http://www.mathworks.co.uk/help/matlab/ref/colormap. html). – Oleg

+0

Używam colormap latem. Próbowałem także innych map kolorów, ale to nie pomogło. Po prostu nie chcę widzieć tych pasów, ale chcę uzyskać płynne przejście z jednej komórki do drugiej. – bordart

+0

Użyj [interp2] (http://www.mathworks.fr/fr/help/matlab/ref/interp2.html), aby utworzyć interpolowaną powierzchnię z histogramu, a następnie ją wyświetlić. – Bentoy13

Odpowiedz

7

Możesz użyć funkcji gridfit z matlab file exchange. Gładki efekt wynika zarówno z interpolacji (więcej punktów do wykresu), jak i pełnego wykorzystania dostępnego koloru (tutaj: colormap jet). Zauważ, że edgecolor ustawiono na none, aby czarne linie zostały usunięte.

Używane tutaj, pobiera wyjście hist3 (matryca 20x20) i interpoluje je (100x100). Następnie wykreśla powierzchnię za pomocą surf. Ponadto można odkomentować opcję camlight.

final = randn(1000,2)'; 
n = hist3(final',[20,20]); %binning 
figure('Color','w'); 

%your code with pcolor 
subplot(1,2,1); 
axis equal; 
colormap(jet); 
n1 = n'; 
n1(size(n,1) + 1 ,size(n,2) + 1) = 0; 
xb = linspace(min(final(:,1)),max(final(:,1)),size(n,1)+1); 
yb = linspace(min(final(:,2)),max(final(:,2)),size(n,1)+1); 
pcolor(xb,yb,n1) 


%density with gridfit function 
subplot(1,2,2); 
nb_interp_point = 100; 
[x,y] = meshgrid(1:size(n,1),1:size(n,2)); 
zgrid = gridfit(x(:), y(:), n, nb_interp_point, nb_interp_point); 
surf(zgrid,'EdgeColor','none') 
set(gca,'YDir','reverse'); 
view(-90,90); 
% camlight right 
% lighting phong 

Oto wynik

enter image description here

+0

Dziękuję bardzo. To właśnie chciałem zrobić. – bordart

3

Aby pozbyć się linii siatki użyć następujących:

hchild=get(gca,'children'); 
set(hchild,'edgecolor','none') 

Colormaps są m x 3 (RGB) tablice. Możesz tworzyć własne colormap. Na przykład można zawęzić zakres colormap używasz, jak w poniższym przykładzie:

cmap=colormap(summer); 
range = [40:64]; % <-- here I am using a 64 element colorspace 
       % and narrowing the selection to the upper range 
nc = size(cmap,1); 

range = [range(1):(range(end)-range(1))/(nc-1):range(end)]; 
cmap(:,1)=interp1([1:nc],cmap(:,1),range); 
cmap(:,2)=interp1([1:nc],cmap(:,2),range); 
cmap(:,3)=interp1([1:nc],cmap(:,3),range); 
colormap(cmap) 
+0

Niestety nie mogę sprawić, aby ten kod działał. Czy możesz to proszę sprawdzić? – bordart

+0

@artalexan Naprawiono! Nieodebrane -1 ... –

+0

Dziękuję bardzo. To jest naprawdę przydatne! p.s. Właśnie usunąłem te nawiasy, ponieważ nie były konieczne. – bordart

Powiązane problemy