Matlab二维密度图

时间:2015-04-20 12:20:25

标签: matlab binning density-plot

我正在尝试为包含两个不同范围的列的数据绘制密度图。 RMSD列为[0-2],角度为[0-200]范围。

我在文件中的数据是这样的:

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. 我希望将x轴和y轴合并为范围的1/10
  2. 两个轴的0将以相同的
  3. 开始
  4. 像这样打印矩阵的每个网格中的元素数量,并根据这些元素数量制作密度图

       0 0.1 0.2 (RMSD)   
    0  0 1 3
    20 2 0 4
    40 1 0 5
    60 0 0 2
    (Angle)
    
  5. 我可以找到进行一维分级的方法,但后来我很难知道如何根据这些值制作密度图,甚至不敢尝试二维分类+绘图。

    感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我想你想要hist3。假设您要指定bin edge (不是bin中心),请使用

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

其中data表示您的数据。

来自链接文档:

  

hist3(X,'Edges',edges),其中edges是具有单调非递减值的数字向量的双元素单元格数组,使用带有edges{1}边的二维网格的二进制网格第一个维度,第二个维度为edges{2}。 (ij)bin包含值X(k,:) if

     

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

使用您的示例数据

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

答案 1 :(得分:0)

对于那些没有Statistics and Machine Learning Toolbox运行双变量直方图(hist3)的人来说,使用替代方法来解决2-D hist问题可能更实际。以下函数生成相同的输出

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

简单而有效。然后你可以运行这样的函数:

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