簡體   English   中英

MATLAB:在保留邊線的同時去除bar3圖中零的顏色

[英]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_mod +透明條

編輯

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM