[英]MATLAB: remove color of zero in bar3 plot while keeping the edge lines
我在Matlab中用bar3绘制一些数据。
在图中,我想将零值留为空白,但我想保留每个零单元格的黑色边缘(即单元格周围的黑线)。
到目前为止,我只能找到一个完全删除空单元格中数据的答案:条形图及其边缘... cf 如何在MATLAB中的bar3图中隐藏零值 。
有没有人想这样做?
先感谢您。
根据我的评论,这是一个解决方案。 概括地说,您不能仅更改由bar3
绘制的一个条的bar3
。
我的解决方案不是手动显示每个条形图,而是修改bar3
的代码以独立绘制每个条形图,您可以自由阅读这些条形图。 当您分析bar3
的代码时,这相当简单:每个条形图都是6 * 4数据矩阵的图形表示。 有问题的代码块如下:
for i=1:size(yy,2)/4
h = [h,surface('xdata',xx+x(i),...
'ydata',yy(:,(i-1)*4+(1:4)), ...
'zdata',zz(:,(i-1)*4+(1:4)),...
'cdata',i*cc, ...
'FaceColor',facec,...
'EdgeColor',edgec,...
'tag','bar3',...
'parent',cax)];
end
如您所见,在每个数据列上都会调用surface
。 要在每个元素上调用surface
,可以如下修改代码:
for i=1:size(yy,2)/4
for j=1:size(yy,1)/6
h = [h,surface('xdata',xx((j-1)*6+(1:5),:)+x(i),...
'ydata',yy((j-1)*6+(1:5),(i-1)*4+(1:4)), ...
'zdata',zz((j-1)*6+(1:5),(i-1)*4+(1:4)),...
'cdata',i*cc((j-1)*6+(1:5),:), ...
'FaceColor',facec,...
'EdgeColor',edgec,...
'tag','bar3',...
'parent',cax)];
end
end
您无法修改原始的bar3
,因此将其保存为bar3_mod
。
完成此操作后,如果您参考有关按高度设置颜色3-D条形的文档文章,现在使零高度的条形透明变得非常简单。 在此之前,请记住,你有得到一个栏的高度get
的是由以下形式的5×4矩阵描述一个栏的手柄:
NaN 0 0 NaN
0 Z Z 0
0 Z Z 0
NaN 0 0 NaN
NaN 0 0 NaN
因此,您仅需测试(2,2)处元素的值并根据需要更改颜色。 在您的情况下,派生链接页面中给出的代码非常简单:
h = bar3_mod(Z);
for k = 1:length(h)
zdata = get(h(k),'ZData');
if zdata(2,2)==0
set(h(k),'CData',zdata,'FaceColor','none');
end
end
我已经在示例中对其进行了测试,并使用magic(5)
作为输入并使高度为1的条透明:
编辑
像bar3
一样,每个数据列只有一种颜色。 如果要根据每个栏的值给它们上色,则可以修改bar3_mod
的代码,或者在使指定的栏透明时添加更多说明。
第一种解决方案:更改for循环非常简单:
for i=1:size(yy,2)/4
for j=1:size(yy,1)/6
h = [h,surface('xdata',xx((j-1)*6+(1:5),:)+x(i),...
'ydata',yy((j-1)*6+(1:5),(i-1)*4+(1:4)), ...
'zdata',zz((j-1)*6+(1:5),(i-1)*4+(1:4)),...
'cdata',zz((j-1)*6+2,(i-1)*4+2)*cc((j-1)*6+(1:5),:), ... % here is the modification
'FaceColor',facec,...
'EdgeColor',edgec,...
'tag','bar3',...
'parent',cax)];
end
end
第二种解决方案:添加else
情况,影响新的颜色数据:
for k = 1:length(h)
zdata = get(h(k),'ZData');
if zdata(2,2)==0
set(h(k),'CData',zdata,'FaceColor','none');
else
set(h(k),'CData',ones(size(zdata))*zdata(2,2));
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.