Matlab 颜色图和 caxis 匹配非线性图
Matlab colormap & caxis matching nonlinear plots
我试图使我的数据与下面发布的地图(左图)匹配,但无法找出颜色条的正确代码。增量是非线性的。
这是我拥有的相关代码(它是一个非常大的空间映射代码的一部分,因此很遗憾无法使其重现):
caxes.donatt = [0 2.5];
colormaps.donat = mf_colormap_cpt('BlWhRe', 8);
colormaps.donat(1:1,:) = [0.00 0.00 0.50];
colormaps.donat(2:2,:) = [0.00 0.50 1.00];
colormaps.donat(3:3,:) = [0.67 0.90 0.93];
colormaps.donat(4:4,:) = [1.00 1.00 1.00];
colormaps.donat(5:5,:) = [1.00 0.87 0.68];
colormaps.donat(6:6,:) = [0.98 0.67 0.38];
colormaps.donat(7:7,:) = [1.00 0.40 0.10];
colormaps.donat(8:8,:) = [1.00 0.00 0.00];
这是颜色条预期结果的图片:
expected result
这是我使用上面显示的代码的当前结果:
current colorbar result
这里的问题是您试图模拟的颜色图是非线性的,但 MATLAB 以线性方式将数据映射到颜色图。您可以通过首先使用 histcounts
to create a linear mapping, then adjusting the color bar ticks labels 对数据进行装箱来解决此问题,使您的线性颜色图看起来非线性。这是一个例子:
data = 2.5.*rand(200); % Sample random data in the range [0 2.5]
edges = [0 0.5 0.75 0.9 1.1 1.25 1.5 2 2.5]; % Define edges of nonlinear map
imgMap = [0.00 0.00 0.50; ... % Colormap colors
0.00 0.50 1.00; ...
0.67 0.90 0.93; ...
1.00 1.00 1.00; ...
1.00 0.87 0.68; ...
0.98 0.67 0.38; ...
1.00 0.40 0.10; ...
1.00 0.00 0.00];
[~, ~, bin] = histcounts(data, edges); % Bin the data according to the edges
image(bin); % Plot bin index, not the original data
colormap(imgMap); % Add new colormap
hBar = colorbar; % Add color bar
set(hBar, 'TickLabels', ... % Modify color bar tick labels
[{''}; cellstr(num2str(edges(2:(end-1)).', '%g')); {''}]);
这里是示例图:
请注意,如果您的数据包含 NaN
values, you will get a bin value 个 0,在上面的示例中,它将映射到颜色图范围内的最低值(这是 imgMap
的第一个元素)。要重构这些 NaN
值,请在使用 histcounts
合并数据后执行以下操作:
bin(bin == 0) = nan;
我试图使我的数据与下面发布的地图(左图)匹配,但无法找出颜色条的正确代码。增量是非线性的。
这是我拥有的相关代码(它是一个非常大的空间映射代码的一部分,因此很遗憾无法使其重现):
caxes.donatt = [0 2.5];
colormaps.donat = mf_colormap_cpt('BlWhRe', 8);
colormaps.donat(1:1,:) = [0.00 0.00 0.50];
colormaps.donat(2:2,:) = [0.00 0.50 1.00];
colormaps.donat(3:3,:) = [0.67 0.90 0.93];
colormaps.donat(4:4,:) = [1.00 1.00 1.00];
colormaps.donat(5:5,:) = [1.00 0.87 0.68];
colormaps.donat(6:6,:) = [0.98 0.67 0.38];
colormaps.donat(7:7,:) = [1.00 0.40 0.10];
colormaps.donat(8:8,:) = [1.00 0.00 0.00];
这是颜色条预期结果的图片: expected result
这是我使用上面显示的代码的当前结果: current colorbar result
这里的问题是您试图模拟的颜色图是非线性的,但 MATLAB 以线性方式将数据映射到颜色图。您可以通过首先使用 histcounts
to create a linear mapping, then adjusting the color bar ticks labels 对数据进行装箱来解决此问题,使您的线性颜色图看起来非线性。这是一个例子:
data = 2.5.*rand(200); % Sample random data in the range [0 2.5]
edges = [0 0.5 0.75 0.9 1.1 1.25 1.5 2 2.5]; % Define edges of nonlinear map
imgMap = [0.00 0.00 0.50; ... % Colormap colors
0.00 0.50 1.00; ...
0.67 0.90 0.93; ...
1.00 1.00 1.00; ...
1.00 0.87 0.68; ...
0.98 0.67 0.38; ...
1.00 0.40 0.10; ...
1.00 0.00 0.00];
[~, ~, bin] = histcounts(data, edges); % Bin the data according to the edges
image(bin); % Plot bin index, not the original data
colormap(imgMap); % Add new colormap
hBar = colorbar; % Add color bar
set(hBar, 'TickLabels', ... % Modify color bar tick labels
[{''}; cellstr(num2str(edges(2:(end-1)).', '%g')); {''}]);
这里是示例图:
请注意,如果您的数据包含 NaN
values, you will get a bin value 个 0,在上面的示例中,它将映射到颜色图范围内的最低值(这是 imgMap
的第一个元素)。要重构这些 NaN
值,请在使用 histcounts
合并数据后执行以下操作:
bin(bin == 0) = nan;