zoukankan      html  css  js  c++  java
  • matlab在3维空间非xy平面绘制直方图

      最近由于同学需要,要帮忙绘制一张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;

    测试结果图:

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

  • 相关阅读:
    map按照值排序
    结构体的三种排序方式
    归并排序
    数组模拟双向链表
    二刷斐波那契高精度
    2019年9月训练(贰)区间DP (luogu 4290)
    2019年9月训练(壹)数位DP (HDU 2089)
    2019年8月训练(贰)
    2019年8月训练(壹)二分,三分
    2019年7月训练(柒)
  • 原文地址:https://www.cnblogs.com/followyourheart/p/2708759.html
Copyright © 2011-2022 走看看