2013-08-26 3 views
7

Я использую функцию hist3() для построения плотности точек. Он создает сетку и находит количество точек в каждой сетке, затем создает сюжет. Но цвета на графике дискретны. Есть ли возможность сделать это распределение плавным, т. Е. Сделать переход от одного цвета к другому более плавным. Теперь все ячейки сетки имеют разные цвета, от ухмылки до желтого, и распределение не очевидно.Можно ли сделать графики hist3 более гладкими?

Я использую следующий код.

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); 

Заранее спасибо.

+1

проверить из [ 'Colormap()'] (http://www.mathworks.co.uk/help/matlab/ref/colormap. HTML). – Oleg

+0

Я использую летнюю колокольню. Я также пробовал другие цветовые карты, но это не помогло. Я просто не хочу видеть эти линии, но хочу получить плавный переход от одной ячейки к другой. – bordart

+0

Используйте [interp2] (http://www.mathworks.fr/fr/help/matlab/ref/interp2.html), чтобы создать интерполированную поверхность с гистограммы, а затем отобразите ее. – Bentoy13

ответ

7

Вы можете использовать gridfit функцию из matlab file exchange. Гладкий эффект происходит как от интерполяции (больше точек до графика), так и от полного использования доступного цвета (colormap jet здесь). Обратите внимание, что edgecolor установлено на none, чтобы черные линии были удалены.

Как он используется здесь, он принимает результат hist3 (матрица 20x20) и интерполирует его (100x100). Затем он обрабатывает поверхность, используя surf. Кроме того, вы можете раскомментировать параметр 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 

Вот результат

enter image description here

+0

Огромное вам спасибо. Это то, что я хотел сделать. – bordart

3

Чтобы избавиться от линий сетки используйте следующее:

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

цветовые карты являются м х 3 (RGB) массивы. Вы можете создавать свои собственные colormap. Например, вы можете сузить диапазон colormap вы используете, как в следующем примере:

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

К сожалению, я не могу заставить этот код работать. Не могли бы вы проверить его? – bordart

+0

@artalexan Исправлено! Пропущенный -1 ... –

+0

Большое вам спасибо. Это действительно полезно! постскриптум Я просто удалил эти скобки, потому что они не были нужны. – bordart

Смежные вопросы