应用对数刻度后,MATLAB 3d 条形图中相同高度的条形颜色不同

问题描述 投票:0回答:1

我正在尝试使用颜色图在 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。

有人知道解决办法吗?

matlab 3d bar-chart
1个回答
0
投票
默认

CDataMapping

是“缩放”的,通过使用“直接”映射,您可以避免由于颜色图与对数比例的不可靠索引而引起的问题。

来自表面属性文档:

'direct' - 将值解释为当前颜色图的索引。带有小数部分的值固定为最接近的较小整数。 [...]

'scaled' - 将值缩放到最小和最大颜色限制之间的范围。坐标区的 CLim 属性包含颜色限制。

你想要的尺度是

255 * log10(zdata) ./ mx

,因为

    255 是颜色图的最大索引
  • 您使用的是对数刻度,因此颜色图需要与 zdata 值的对数对齐
  • 除以 zdata 的最大值 (log10)
完整的示例,包括您的面部颜色和问题中的 log(0) 修复,看起来像这样:

% 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
输出:

bar plot

© www.soinside.com 2019 - 2024. All rights reserved.