2017-07-24 166 views
2

請看下面的例子:MATLAB彩條 - 顏色相同,換算值

[ X, Y, Z ] = peaks(30); 
figure(100); 
surfc(X, Y, Z); 
zlabel('Absolute Values'); 
colormap jet; 
c = colorbar('Location', 'EastOutside'); 
ylabel(c, 'Relative Values'); 

的輸出如下: MATLAB Colorbar - Absolute Scaling

我怎麼能規模的彩條蜱,即擴展的C軸(例如,將值除以100):

  • 而不改變圖上的z值和顏色
  • 而不改變在彩條
  • 的顏色而不改變在圖上的顏色之間的關係,在彩條的顏色和情節的z值
  • 同時仍然使用全範圍的顏色條的
  • z | c-axis 
    ---------- 
    8 | 8/100 
    6 | 6/100 
    4 | 4/100 
    . | ... 
    

    功能caxis,如I:

在上圖中,我想是按比例的c軸,使得其示出了用於相關Z該值支持它,在這裏不適合,因爲它只顯示z軸的一個子部分的顏色,而不顯示整個z軸的顏色。

獎金問題:如何將顏色映射和顏色條作爲X,Y和/或Z的函數進行縮放?

回答

2
[ X, Y, Z ] = peaks(30); 
figure(101); 
surfc(X, Y, Z); 
zlabel('Absolute Values'); 
% 
Z_Scl = 0.01; 
Z_Bar = linspace(min(Z(:)), max(Z(:)), 10); 
% 
colormap jet; 
c = colorbar('Location', 'EastOutside', ... 
    'Ticks', Z_Bar, 'TickLabels', cellstr(num2str(Z_Bar(:)*Z_Scl, '%.3e'))); 
ylabel(c, 'Relative Values'); 

MATLAB Colorbar - Scaled Colorbar - Version 1

對於z值和所述顏色條之間的任意的映射,所以能夠surfcontourfcontour結合如下(由thesetwo偉大的答案啓發):

[ X, Y, Z ] = peaks(30); % Generate data 
CB_Z = (sin(Z/max(Z(:))) - cos(Z/max(Z(:)))).^2 + X/5 - Y/7; % Generate colormap 
CF_Z = min(Z(:)); % Calculate offset for filled contour plot 
CR_Z = max(Z(:)); % Calculate offset for contour plot 
% 
figure(102); % Create figure 
clf(102); 
hold on; grid on; grid minor; % Retain current plot and create grid 
xlabel('x'); % Create label for x-axis 
ylabel('y'); % Create label for y-axis 
zlabel('Scaling 1'); % Create label for z-axis 
surf(X, Y, Z, CB_Z); % Create surface plot 
% 
CF_H = hgtransform('Parent', gca); % https://stackoverflow.com/a/24624311/8288778 
contourf(X, Y, CB_Z, 20, 'Parent', CF_H); % Create filled contour plot 
set(CF_H, 'Matrix', makehgtform('translate', [ 0, 0, CF_Z ])); % https://stackoverflow.com/a/24624311/8288778 
% 
CR_H = hgtransform('Parent', gca); % https://stackoverflow.com/a/24624311/8288778 
contour(X, Y, CB_Z, 20, 'Parent', CR_H); % Create contour plot 
set(CR_H, 'Matrix', makehgtform('translate', [ 0, 0, CR_Z ])); % https://stackoverflow.com/a/24624311/8288778 
% 
colormap jet; % Set current colormap 
CB_H = colorbar('Location', 'EastOutside'); % Create colorbar 
caxis([ min(CB_Z(:)), max(CB_Z(:)) ]); % Set the color limits for the colorbar 
ylabel(CB_H, 'Scaling 2'); % Create label for colorbar 

MATLAB Surf Contourf Contour Colorbar

+1

你想在z軸上的值是從c軸不同?這有點誤導... – EBH

+0

@EBH問題已更新,現在清楚還是誤導? – Discbrake

+1

你的意圖甚至在以前很清楚,在我看來,無論是多餘的還是誤導性的,都顯示了2個軸的相同值。但我想這可能對某些可視化有用(我認爲寧願將括號內的一個值放在z軸內,例如'5(0.05)')。 – EBH

1

當我寫in your answer時,我認爲顯示兩個相關值的更好選擇不是爲此創建新的軸,而是爲了向他們展示一個相鄰的軸。這裏有一個建議:

[X,Y,Z] = peaks(30); 
surfc(X,Y,Z); 
zlabel('Absolute (Relative) Values'); 
colormap jet 
Z_Scl = 0.01; 
zticks = get(gca,'ZTick'); 
set(gca,'ZTickLabel',sprintf('%g (%g)\n',[zticks;zticks.*Z_Scl])) 

enter image description here

+0

MWEs在這裏不鼓勵嗎?我仍然相信添加'ax = gca'這一行可能會幫助沒有經驗的用戶,因爲它不會像現在這樣運行。 – Discbrake

+0

@ user5564832你對!我的道歉,我在我的代碼的兩個版本之間混合,忘了解決這個問題。現在修復。 – EBH

+0

完美無瑕,您的版本看起來更乾淨,並感謝您的答案,好主意。 – Discbrake