Matlab 2-D density plot

妖精的绣舞 提交于 2019-12-23 19:23:16

问题


I am trying to do a density plot for a data containing two columns with different ranges. The RMSD column is [0-2] and Angle is [0-200] ranges.

My data in the file is like this:

0.0225370 37.088  
0.1049553 35.309  
0.0710002 33.993  
0.0866880 34.708  
0.0912664 33.011  
0.0932054 33.191  
0.1083590 37.276  
0.1104145 34.882  
0.1027977 34.341  
0.0896688 35.991  
0.1047578 36.457  
0.1215936 38.914  
0.1105484 35.051  
0.0974138 35.533  
0.1390955 33.601  
0.1333878 32.133  
0.0933365 35.714  
0.1200465 33.038  
0.1155794 33.694  
0.1125247 34.522  
0.1181806 37.890  
0.1291700 38.871  
  1. I want both x and y axis to be binned 1/10th of the range
  2. The 0 of both the axis to be starting in the same
  3. Print the number of elements in each grid of the matrix like this and make a density plot based on these number of elements

       0 0.1 0.2 (RMSD)   
    0  0 1 3
    20 2 0 4
    40 1 0 5
    60 0 0 2
    (Angle)
    

I can find ways to do 1-D binning but then I am stumped about how to make a density plot from those values and havent even dared to attempt2-D binning + plotting.

Thanks for the help


回答1:


I think you want hist3. Assuming you want to specifty bin edges (not bin centers), use

result = hist3(data, 'Edges', {[0 .1 .2], [0 20 40 60]}).';

where data denotes your data.

From the linked documentation:

hist3(X,'Edges',edges), where edges is a two-element cell array of numeric vectors with monotonically non-decreasing values, uses a 2-D grid of bins with edges at edges{1} in the first dimension and at edges{2} in the second. The (i,j)th bin includes the value X(k,:) if

edges{1}(i) <= X(k,1) < edges{1}(i+1)
edges{2}(j) <= X(k,2) < edges{2}(j+1)

With your example data this gives

result =
     0     0     0
     8    14     0
     0     0     0
     0     0     0



回答2:


For those who don't have Statistics and Machine Learning Toolbox to run bivariate histogram (hist3), it may be more practical using an alternative to solve 2-D hist problem. The following function generates the same output

function N = hist3_alt(x,y,edgesX,edgesY)
N = zeros(length(edgesY)-1,length(edgesX)-1);
[~,~,binX] = histcounts(x,edgesX);
for ii=1:numel(edgesX)-1
    N(:,ii) = (histcounts(y(binX==ii),edgesY))';
end

It's simple and efficient. Then you could run the function like this:

N = hist3_alt(x,y,[0:0.1:2],[0:20:200])


来源:https://stackoverflow.com/questions/29747718/matlab-2-d-density-plot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!