bar3
返回表面對象,每個組(即,一個用於每種顏色),因此在一個組中的所有條基本上描繪爲一個「斷」表面的作用。這在this answer中有很好的解釋,所以我在這裏不再重複。
相反,我會找到針對這個特定問題的解決方案。表面的相關屬性是CData
。當我們創建條形圖時,每個曲面的CData
都被賦予一個大小爲矩陣的矩陣(我們將會得到這個),它們都是相同的一個值。每個表面的值不同。這就是整個圖形如何將其顏色圖轉化爲組的顏色。
如上所述(並在linked answer中詳細說明),每個組由一個表面表示,所以它需要一個整體矩陣來定義表面上每個點的顏色。我們要做的第一件事是讓這個矩陣大小:
Z = peaks(5);
bar_h = bar3(Z);
% we take only the first one, but they are all the same size:
cdata_sz = size(bar_h(1).CData)
cdata_sz =
30 4
CData
一向4列(見here爲什麼),和行數始終是6 *號的組。這是因爲需要5個頂點來創建一個帶有區域對象的閉合矩形(最後一個頂點與第一個頂點相似),一條線用於NaN之間的間距,因此它們看上去是分開的。
接下來,我們需要放大我們的原始顏色映射(與Z
的尺寸相同),以正確的方式適合CData
。基本上,我們只是想爲屬於同一個條的所有頂點重複相同的值。假設Z
也是我們的顏色數據(即通過高度我們的顏色),我們這樣做:
z_color = repelem(Z,6,4)
現在,我們需要我們的z_color
不同的細胞分裂在我們組的數量。每個單元格將包含一個表面對象的着色數據:
z_color = mat2cell(z_color,cdata_sz(1),ones(1,size(Z,2))*cdata_sz(2));
最後,我們新的顏色數據適用於條形圖:
set(bar_h,{'CData'},z_color.')
作爲獎勵,如果我們要刪除所有從我們的酒吧零個值,它可以很容易地將它們設置爲NaN完成:
Z(abs(Z)<eps) = nan;
C(isnan(Z)) = nan; % if we use a colormap C different from Z
上述所有可以歸結爲這樣方便的功能:
function bar_h = Cbar3(Z,C,b,y)
% Z - The data
% C - CData (if other then Z values)
% b - Minimum absolute value to keep colored
% y - y-axis values to order the data by
if nargin<2, C = Z; end
if nargin<3 || isempty(b), b = 0; end
Z(abs(Z)<b) = nan;
C(isnan(Z)) = nan;
if nargin<4
bar_h = bar3(Z);
else
bar_h = bar3(y,Z);
end
cdata_sz = size(bar_h(1).CData);
z_color = repelem(C,6,4);
z_color = mat2cell(z_color,...
cdata_sz(1),ones(1,size(Z,2))*cdata_sz(2));
set(bar_h,{'CData'},z_color.')
end
使用示例:
subplot 121
Z = peaks(30);
Cbar3(Z,Z,0.5);
pbaspect auto
shading flat % just to get a cleaner look
title('Cbar3 using height as color')
subplot 122
Cbar3(Z,rand(size(Z)),0.5);
pbaspect auto
shading flat % just to get a cleaner look
title('Cbar3 using random as color')
結果:
我認爲它更易於設置'FaceColor'到''interp'':'圖(); hS = surf(高峯(50),'edgecolor','none'); hS.FaceColor ='interp';'。你可以通過我的答案中的鏈接看到'bar3'中的插值顏色。 –
@ Dev-iL當然,我不知道爲什麼我做了一半的功能調用和一半的不同的調用 –