Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我有一个用bar3 plot命令生成的2D直方图(绘图是3D-并排绘制的几个直方图)。但是,所有零值在xy平面中均显示为扁平正方形。有什么方法可以防止MATLAB显示值吗?我已经尝试过用NaN替换所有零,但是它并没有改变情节。这是我一直在尝试的代码:
x1=normrnd(50,15,100,1); %generate random data to test code x2=normrnd(40,13,100,1); x3=normrnd(65,12,100,1); low=min([x1;x2;x3]); high=max([x1;x2;x3]); y=linspace(low,high,(high-low)/4); %establish consistent bins for histogram z1=hist(x1,y); z2=hist(x2,y); z3=hist(x3,y); z=[z1;z2;z3]'; bar3(z) 如您所见,图中有很多零值。关闭数字并用NaN替换零后重新绘图似乎没有任何改变: close z(z==0)=NaN; bar3(z) 回答: 一种解决方案是修改bar3创建的图形对象。首先,您必须从bar3返回bar3 : h = bar3(z); 在您的情况下, h将是3个元素的控点向量,每组彩色条对应一个。然后,以下代码应使计数为零的垃圾箱不可见: for i = 1:numel(h) index = logical(kron(z(:, i) == 0, ones(6, 1))); zData = get(h(i), 'ZData'); zData(index, :) = nan; set(h(i), 'ZData', zData); end 这是一个插图(带有强制性的手绘圈): ![]() 怎么运行的... 如果您的箱计数向量为N-by-1 ,则bar3将绘制6*N矩形块(即,每个箱的长方体的6个面)。因此, h每组补丁对象的'ZData'属性将是(6*N)-by-4 ,因为每个矩形面都有4个角。因此, 'ZData'属性的6行的每个群集都是一个bin的6个面的一组z坐标。 上面的代码首先创建一个逻辑矢量,在所有bin计数等于0的地方都带有一个逻辑矢量,然后使用kron函数将该矢量的每个元素复制6次。这将成为'ZData'属性的行的索引,并且此索引用于将空箱的补丁的z坐标设置为nan 。这将导致补丁无法渲染。 编辑: 这是代码的略微修改版本,可通过从绘制的条形图的'ZData'属性获取条形图高度来使其更加通用,因此,工作所需要做的就是从bar3返回的句柄。我还将代码包装在一个函数中(没有错误和输入检查): function remove_empty_bars(hBars) for iSeries = 1:numel(hBars) zData = get(hBars(iSeries), 'ZData'); % Get the z data index = logical(kron(zData(2:6:end, 2) == 0, ones(6, 1))); % Find empty bars zData(index, :) = nan; % Set the z data for empty bars to nan set(hBars(iSeries), 'ZData', zData); % Update the graphics objects end end 更多&回答... |
![]() |
![]() |