MATLAB:在保留边线的同时去除bar3绘图中的零颜色

时间:2014-08-05 17:38:10

标签: matlab plot

我正在使用Matlab中的bar3绘制一些数据。

在图中,我想将零值设为空白,但我想保留每个零像素的黑边(即单元格周围的黑线)。

到目前为止,我只能找到一个完全删除空单元格中数据的答案:条形图及其边缘... cf How to hide zero values in bar3 plot in MATLAB

有人有这个想法吗?

提前谢谢。

1 个答案:

答案 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_mod + transparent bar

修改

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