登录论坛

查看完整版本 : 如何在MATLAB中的bar3图中隐藏零值


poster
2019-12-10, 20:30
我有一个用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 (https://www.mathworks.com/help/matlab/ref/bar3.html)创建的图形对象。首先,您必须从bar3 (https://www.mathworks.com/help/matlab/ref/bar3.html)返回bar3 (https://www.mathworks.com/help/matlab/ref/bar3.html) :

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 这是一个插图(带有强制性的手绘圈):

https://i.stack.imgur.com/G2moN.jpg (https://i.stack.imgur.com/G2moN.jpg)

怎么运行的...

如果您的箱计数向量为N-by-1 ,则bar3 (https://www.mathworks.com/help/matlab/ref/bar3.html)将绘制6*N矩形块(即,每个箱的长方体的6个面)。因此, h每组补丁对象的'ZData'属性将是(6*N)-by-4 ,因为每个矩形面都有4个角。因此, 'ZData'属性的6行的每个群集都是一个bin的6个面的一组z坐标。

上面的代码首先创建一个逻辑矢量,在所有bin计数等于0的地方都带有一个逻辑矢量,然后使用kron (https://www.mathworks.com/help/matlab/ref/kron.html)函数将该矢量的每个元素复制6次。这将成为'ZData'属性的行的索引,并且此索引用于将空箱的补丁的z坐标设置为nan (https://www.mathworks.com/help/matlab/ref/nan.html) 。这将导致补丁无法渲染。

编辑:

这是代码的略微修改版本,可通过从绘制的条形图的'ZData'属性 (https://www.mathworks.com/help/matlab/ref/primitivesurface-properties.html#property_d0e894178)获取条形图高度来使其更加通用,因此,工作所需要做的就是从bar3 (https://www.mathworks.com/help/matlab/ref/bar3.html)返回的句柄。我还将代码包装在一个函数中(没有错误和输入检查):

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

更多&回答... (https://stackoverflow.com/questions/2050367)