matlab中,有一组二维数据,如何将hist3绘制的频率三维频率直方图中Z轴的频数变成频率,之后取点

matlab中,有一组二维数据,如何将hist3绘制的频率三维频率直方图中Z轴的频数变成频率,之后取点

问题描述:

一组X和Y相互关联的二维的数据数据(xn,yn),如何绘制三维的频率直方图,然后Z轴显示频率,再把每个间距的数据(x,y,z)都提取出来

你好,之前给你弄过累计的,现在直接每个小格子里的也行啊:

function [X, Y, CDF] = ef2(x,y,nx,ny,xminmax,yminmax)
% x:x的值
% y:y的值
% nx:x方向划分段数
% ny:y方向划分段数
% xminmax = [xmin, xmax]
% yminmax = [ymin, ymax]
num = length(x);
if(num~=length(y))
   error('输入的x和y长度必须相等') 
end
if(nargin>6) % 如果变量个数大于6个,太多了
    error('太多输入变量')
elseif(nargin<2) % 如果变量个数小于2个,太少了
    error('输入变量数目不足!!')
end
if(nargin==6) % 如果变量个数等于6个,赋值给ymin和ymax
    ymin = yminmax(1);
    ymax = yminmax(2);
end
if(nargin>=5)% 如果变量个数大于等于5个,赋值给xmin和xmax
    xmin = xminmax(1);
    xmax = xminmax(2);
end
if(nargin<=4)% 如果变量个数小于等于4个,自定义xmin和xmax
    xmin = min(x);
    xmax = max(x)+eps;
    ymin = min(y);
    ymax = max(y)+eps;
end
if(nargin<=3)% 如果变量个数小于等于3个,自定义y方向划分段数ny
    ny = 30;
end
if(nargin==2)% 如果变量个数等于2个,自定义x方向划分段数nx
    nx = 30;
end
xg = linspace(xmin, xmax, nx);%x方向的点
yg = linspace(ymin, ymax, ny);%y方向的点
[X,Y] = meshgrid((xg(1:end-1)+xg(2:end))/2, (yg(1:end-1)+yg(2:end))/2);%形成网格
[I,J] = meshgrid(2:nx, 2:ny);%下标网格
CDF = arrayfun(@(i,j)sum(x>=xg(i-1)&x<xg(i)&y<yg(j)&y>=yg(j-1))/num,I,J);%形成经验分布
end

主函数

clc;clear
num = 1000000;
x = randn(num,1);% 为了说明弄了两个正态分布搞联合,实际数据会更好
y = randn(num,1);
[X, Y, C] = ef2(x,y);% ,50,50,[-3, 3],[-3, 3]
figure(1);clf
surf(X,Y,C)

img

Z轴就是频率