3

我正在尝试为包含具有不同范围的两列的数据绘制密度图。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. 像这样打印矩阵的每个网格中的元素数量,并根据这些元素数量制作密度图

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

我可以找到进行 1-D 分箱的方法,但后来我对如何根据这些值制作密度图感到困惑,甚至不敢尝试 2-D 分箱 + 绘图。

谢谢您的帮助

4

2 回答 2

1

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

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

wheredata表示您的数据。

从链接的文档中:

hist3(X,'Edges',edges),其中edges是具有单调非递减值的数值向量的双元素元胞数组,它使用一个二维网格,其边缘在edges{1}第一维和edges{2}第二维中。第 ( i, j) 个 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
于 2015-04-20T13:41:08.300 回答
0

对于那些没有统计和机器学习工具箱来运行二元直方图 ( hist3 ) 的人来说,使用替代方法来解决二维直方图问题可能更实用。以下函数生成相同的输出

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])
于 2015-04-20T17:39:11.443 回答