最近由于同学需要,要帮忙绘制一张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) % 自定义在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
测试代码:
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;
测试结果图:
再上一张用这个函数绘制的图: