matlab在3维空间非x-y平面绘制直方图

时间:2024-02-15 14:25:32

  最近由于同学需要,要帮忙绘制一张matlab的三维空间的图,带有数据的二维分布。在网上找了很久,也没有找到matlab中关于在非x-y平面绘制直方图的函数,估计是mathworks公司觉得写这个函数没有必要。(也许是鄙人搜索学习能力有限,没有找到)
  木有办法,自己动手,丰衣足食。自己想办法画吧。

  绘制直方图原理上也很简单,只是在非二维空间上画要选择合适的函数,fill3函数正符合我们的要求。

    fill3(X,Y,Z,C) fills the 3-D polygon defined by vectors X, Y and Z
    with the color specified by C.  The vertices of the polygon
    are specified by triples of components of X, Y and Z.  If necessary,
    the polygon is closed by connecting the last vertex to the first.

   X,Y,Z的维度相同,假设为m*n维矩阵,则每一行分布代表m个点的x,y,z三个方向的坐标,这些点绘制成一个多边形。每行绘制一个多边形,共绘制出n个多边形。

 利用这个函数在空间上填充出一个矩形块,就实现了绘制直方图的基础。

  先尝试在3维空间的对应平面绘制出矩形,然后再考虑将拿到的直方图数据绘制到对应的平面上。这里给出在yz平面和xz平面绘制的函数(xy平面使用hist就能实现,因此不再重复了)。主要考虑是如何和hist函数对接使用,即调用的参数中,N和X的意义和hist函数中的一样,这样通过调用hist函数,将函数结果N以及参数X作为hist3函数的参数即可绘制。这里的代码还没有特别完善,直方图的X必须是等步长变化,因为直方图的bar的宽度统一取的是第一段的长度(要和X步长完全一致也很容易,以及自定义颜色等,可以自行考虑修改)。

function hist_diy(N,X,type,YBound)
function hist_diy(N,X,type,YBound)
% 自定义在3维空间非x-y平面绘制直方图
% N:直方图数值
% X:每个数值对应的区间横坐标
%type:直方图轴选择:1----在yz轴上绘制,2----在xz轴上绘制
%YBound:YZ平面上绘制时X轴方向的偏移
% Date:2012/09/27

%

bar_height=N(1);
bar_width=X(2)-X(1);
A=bar_width*[0,1,1,0]\'; 
if type==1
    B=zeros(4,1);
end
if type==2
    B=ones(4,1)*YBound;
end
C=bar_height*[0,0,1,1]\';  
fill3(A,B,C,\'b\');

for i=2:length(X)
    bar_height=N(i);
    A=A+bar_width*ones(4,1);    
    C=bar_height*[0,0,1,1]\';  
    if type==1
        fill3(B,A,C,\'b\');
    end
    if type==2
        fill3(A,B,C,\'b\');        
    end
end

测试代码:

test code
 1 %test hist3
 2 x = -4:0.1:4;%直方图X方向间隔坐标
 3 y = randn(10000,1);%待统计数据
 4 YBound=0;%YZ平面上绘制时X轴方向的偏移
 5 subplot(2,1,1);
 6 view(135,30);
 7 hold on;
 8 N=hist(y,x);
 9 hist_diy(N,x,1,YBound);%xz方向
10 hist_diy(N,x,2,YBound);
11 hxlabel=xlabel(\'X\');
12 hylabel=ylabel(\'Y\');
13 hzlabel=zlabel(\'Z\');
14 set(hxlabel,\'FontSize\',16,\'FontName\',\'Times New Roman\');
15 set(hylabel,\'FontSize\',16,\'FontName\',\'Times New Roman\');
16 set(hzlabel,\'FontSize\',16,\'FontName\',\'Times New Roman\');
17 grid;
18 hold off;
19 subplot(2,1,2);
20 hist(y,x);
21 hxlabel=xlabel(\'X\');
22 hylabel=ylabel(\'Y\');
23 set(hxlabel,\'FontSize\',16,\'FontName\',\'Times New Roman\');
24 set(hylabel,\'FontSize\',16,\'FontName\',\'Times New Roman\');
25 grid;

测试结果图:

再上一张用这个函数绘制的图: