Matlab 2-D плотностный график
Я пытаюсь сделать график плотности для данных, содержащих два столбца с различными диапазонами. Столбец 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
- Я хочу, чтобы обе оси x и y были связаны 1/10 диапазона
- 0 обеих осей, которые будут начинаться в одной и той же
Напечатайте количество элементов в каждой сетке матрицы, как показано ниже, и построите график плотности на основе этого количества элементов.
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 биннинг + построение графиков.
Спасибо за помощь
2 ответа
Я думаю ты хочешь hist3
, Предполагая, что вы хотите указать края бина (не центры бина), используйте
result = hist3(data, 'Edges', {[0 .1 .2], [0 20 40 60]}).';
где data
обозначает ваши данные.
Из связанной документации:
hist3(X,'Edges',edges)
, гдеedges
представляет собой двухэлементный массив ячеек числовых векторов с монотонно неубывающими значениями, использует двумерную сетку ячеек с ребрами вedges{1}
в первом измерении и вedges{2}
во-вторых. (i
,j
) й бен включает в себя значениеX(k,:)
если
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
Для тех, у кого нет Инструментов статистики и машинного обучения для запуска двумерной гистограммы ( 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])