我正在使用Matlab中的bar3绘制一些数据。
在图中,我想将零值设为空白,但我想保留每个零像素的黑边(即单元格周围的黑线)。
到目前为止,我只能找到一个完全删除空单元格中数据的答案:条形图及其边缘... cf How to hide zero values in bar3 plot in MATLAB。
有人有这个想法吗?
提前谢谢。
答案 0 :(得分:1)
根据我的评论,这是一个解决方案。简而言之,您无法仅更改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
。
完成此操作后,如果您参考有关Color 3-D Bars by Height的doc文章,现在可以非常简单地将零高度条形图透明化。在此之前,请记住,在一个条形手柄上使用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