I use hist3() function to plot the density of points. It creates a grid and finds the number of points in each grid, then it creates the plot. But the colors on the plot are discrete. Is there an option to make this distribution smooth, i.e. make transition from one color to another smoother. Now all the cells of the grid have different colors, from grin to yellow and the distribution is not apparent.
I use the following code.
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);
Thanks in advance.
You may want to use the gridfit
function from the matlab file exchange. The smooth effect comes from both the interpolation (more points to plot) and the full use of the available color (colormap jet
here). Note that edgecolor
is set to none
so that the black lines are removed.
As it is used here, it takes the output of hist3 (20x20 matrix) and interpolate it (100x100). It then plot a surface using surf
. In addition, you can uncomment the camlight
option.
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
Here is the result
To get rid of the gridlines use the following:
hchild=get(gca,'children');
set(hchild,'edgecolor','none')
Colormaps are m x 3 (rgb) arrays. You are free to create your own colormap
. For instance you can narrow the range of the colormap
you are using, as in the following example:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With