我有一个用bar3 plot命令生成的2D直方图(绘图是3D-并排绘制的几个直方图)。但是,所有零值在x-y平面中均显示为正方形。有什么方法可以防止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
返回的句柄:
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
这是一个插图(带有强制性的手绘圈):这个怎么运作...
如果您的bin计数向量是
N-by-1
,则 bar3
将绘制6*N
矩形补丁(即,每个bin的长方体的6个面)。因此,由于每个矩形面都有4个角,因此'ZData'
中每组补丁对象的h
属性将为(6*N)-by-4
。因此,'ZData'
属性的6行的每个群集都是一个bin的6个面的一组z坐标。上面的代码首先创建一个逻辑矢量,该矢量在所有bin计数等于0的地方都具有一个逻辑矢量,然后使用
kron
函数将该矢量的每个元素复制6次。这将成为'ZData'
属性的行的索引,并且此索引用于将空箱的补丁的z坐标设置为 nan
。这将导致补丁无法渲染。编辑:
这是代码的略微修改版本,通过从绘制的条形图的
'ZData'
property中获取条形高度使它更通用,因此,工作所需要做的就是从 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
关于matlab - 如何在MATLAB中的bar3图中隐藏零值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2050367/