Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:30   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何在MATLAB中的bar3图中隐藏零值

我有一个用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

更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 05:22


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.