我正在尝试使用颜色图在 MATLAB 中绘制 3D 条形图。颜色图没有显示。然后我找到了一种在 bar3 上应用颜色图的解决方法:
b = [...] % my data
b = bar3(Z, 1);
for k = 1:length(b)
zdata = b(k).ZData;
b(k).CData = zdata;
b(k).FaceColor = 'interp';
end
colormap('jet')
我还在Z轴上应用对数刻度。但这弄乱了我的绘图,只显示了条形的顶部表面。我也找到了解决这个问题的方法。
% Z log fix
llim = .1;
h = get(gca,'Children');
for i = 1:length(h)
ZData = get(h(i), 'ZData');
ZData(ZData==0) = llim;
set(h(i), 'ZData', ZData);
end
set(gca,'ZScale','log')
但是在日志修复后我得到以下结果,其中条在相同的 Z 值(高度)下没有相同的颜色。
我正在尝试获得如下图所示的结果。
我的 MATLAB 版本是 R2022a。
有人知道解决办法吗?
CDataMapping
是“缩放”的,通过使用“直接”映射,您可以避免由于颜色图与对数比例的不可靠索引而引起的问题。来自表面属性文档:
'direct' - 将值解释为当前颜色图的索引。带有小数部分的值固定为最接近的较小整数。 [...]你想要的尺度是'scaled' - 将值缩放到最小和最大颜色限制之间的范围。坐标区的 CLim 属性包含颜色限制。
255 * log10(zdata) ./ mx
,因为
% Create some random data
rng(0);
z = 10.^(rand(1,20)*3 + [20,16,10,5,1,0,0].');
% Make the bar plot
figure(1); clf;
b = bar3( z, 1 );
llim = .1; % Min value to avoid log(0) issues
mx = log10(max(z(:),[],'omitnan')); % log of max value in data
% Loop over all bars to recolour
for k = 1:length(b)
% Fix log(0) issue which breaks surfaces
ZData = get(b(k), 'ZData');
ZData(ZData==0) = llim;
set(b(k), 'ZData', ZData);
% Set new CData according to direct scaling between 0 and 255
b(k).CData = 255 * log10(b(k).ZData) ./ mx;
b(k).CDataMapping = 'direct';
% Interp over face for gradient
b(k).FaceColor = 'interp';
end
colormap('jet'); % Set colourmap
set(gca,'ZScale','log'); % Set log scale
输出: