在 MATLAB 中控制颜色条比例
Control colorbar scale in MATLAB
问题:如何在自定义 MATLAB 颜色条中指定颜色过渡?
具体来说, 我想让黄色(见下文)覆盖颜色栏的更多区域(可能是 [19.5–21.5] 或接近于此的区域)。
使用 this answer, I was able to create a custom colorbar in MATLAB. I'm trying to understand 因为它可能是相关的。
我尝试了 and reviewed & 的方法,但无法实现我的目标。
很明显我遗漏了什么。
下面是完整的代表性示例
% MATLAB 2017a
% Data
X = [22.6 22.8 22.6 20.45 22.3 18.15 19.95 20.8].';
Y = [84 89 63 81 68 83 77 52].';
Z = [23.0 22.695 21.1450 21.5 22.09 20.5 22.075 20.915].';
% Create custom colormap
% Reference:
col3 = [0 1 0]; %G
col2 = [1 1 0]; %Y
col1 = [1 0 0]; %R
n1 = 20; n2 = 20;
cmap=[linspace(col1(1),col2(1),n1);linspace(col1(2),col2(2),n1);linspace(col1(3),col2(3),n1)];
cmap(:,end+1:end+n2)=[linspace(col2(1),col3(1),n2);linspace(col2(2),col3(2),n2);linspace(col2(3),col3(3),n2)];
cmap = cmap.';
% Plot
colormap(cmap), hold on, box on
p = scatter(X,Y,[],Z,'filled','DisplayName','Data3');
cb = colorbar;
cb.Limits = [18 23];
cb.Ticks = [18:1:23];
% Cosmetics
p.MarkerEdgeColor = 'k';
xlabel('X')
ylabel('Y')
cb.Label.String = 'Z';
我认为您所缺少的只是调用 caxis
以指定将颜色范围映射到的最小值和最大值:
caxis([18 23]);
注意下面一行...
cb.Limits = [18 23];
... 仅更改颜色条上显示的 tick limits ,但不会更改数据映射到颜色范围的方式。 caxis
函数是您控制它的方式(在上述情况下,将 18 的值映射到一端,将 23 的值映射到另一端)。默认情况下,您的代码将 Z
中的最小值和最大值映射到颜色范围(分别为 20.5 和 23)。当您随后将颜色条上的刻度限制设置为更大的范围时,它只是用颜色图中的最后一种颜色填充它,在本例中为红色。这就是为什么你看到这么多。
奖金
只是因为您可能感兴趣,您也可以通过 interp1
函数使用插值来轻松生成您的颜色图,如下所示:
cmap = interp1([1 0 0; 1 1 0; 0 1 0], linspace(1, 3, 41));
问题:如何在自定义 MATLAB 颜色条中指定颜色过渡?
具体来说, 我想让黄色(见下文)覆盖颜色栏的更多区域(可能是 [19.5–21.5] 或接近于此的区域)。
使用 this answer, I was able to create a custom colorbar in MATLAB. I'm trying to understand
我尝试了
很明显我遗漏了什么。
下面是完整的代表性示例
% MATLAB 2017a
% Data
X = [22.6 22.8 22.6 20.45 22.3 18.15 19.95 20.8].';
Y = [84 89 63 81 68 83 77 52].';
Z = [23.0 22.695 21.1450 21.5 22.09 20.5 22.075 20.915].';
% Create custom colormap
% Reference:
col3 = [0 1 0]; %G
col2 = [1 1 0]; %Y
col1 = [1 0 0]; %R
n1 = 20; n2 = 20;
cmap=[linspace(col1(1),col2(1),n1);linspace(col1(2),col2(2),n1);linspace(col1(3),col2(3),n1)];
cmap(:,end+1:end+n2)=[linspace(col2(1),col3(1),n2);linspace(col2(2),col3(2),n2);linspace(col2(3),col3(3),n2)];
cmap = cmap.';
% Plot
colormap(cmap), hold on, box on
p = scatter(X,Y,[],Z,'filled','DisplayName','Data3');
cb = colorbar;
cb.Limits = [18 23];
cb.Ticks = [18:1:23];
% Cosmetics
p.MarkerEdgeColor = 'k';
xlabel('X')
ylabel('Y')
cb.Label.String = 'Z';
我认为您所缺少的只是调用 caxis
以指定将颜色范围映射到的最小值和最大值:
caxis([18 23]);
注意下面一行...
cb.Limits = [18 23];
... 仅更改颜色条上显示的 tick limits ,但不会更改数据映射到颜色范围的方式。 caxis
函数是您控制它的方式(在上述情况下,将 18 的值映射到一端,将 23 的值映射到另一端)。默认情况下,您的代码将 Z
中的最小值和最大值映射到颜色范围(分别为 20.5 和 23)。当您随后将颜色条上的刻度限制设置为更大的范围时,它只是用颜色图中的最后一种颜色填充它,在本例中为红色。这就是为什么你看到这么多。
奖金
只是因为您可能感兴趣,您也可以通过 interp1
函数使用插值来轻松生成您的颜色图,如下所示:
cmap = interp1([1 0 0; 1 1 0; 0 1 0], linspace(1, 3, 41));