Matlab 提供了函数 newclim 的代码,它通过将颜色图连接成一个颜色图干净地解决了这个问题。我只能在 2012b 帮助中找到此文档,但在网上找不到。
请注意,最后一步用于更新 CLim 的轴可能是冲浪图的轴,这就是我应用此代码的方式。
计算颜色限制
此示例的关键是计算 CLim 的值,使每个表面使用包含适当颜色的颜色图部分。
要计算 Clim 的新值,您需要知道
首先,定义子图区域并绘制曲面。
im1 = load('cape.mat');
im2 = load('flujet.mat');
ax1 = subplot(1,2,1);
imagesc(im1.X)
axis(ax1,'image')
ax2 = subplot(1,2,2);
imagesc(im2.X)
axis(ax2,'image')
连接两个颜色图并安装新的颜色图。
colormap([im1.map;im2.map])
获取为 Clim 计算新值所需的数据。
CmLength = length(colormap); % Colormap length
BeginSlot1 = 1; % Beginning slot
EndSlot1 = length(im1.map); % Ending slot
BeginSlot2 = EndSlot1 + 1;
EndSlot2 = CmLength;
CLim1 = get(ax1,'CLim'); % CLim values for each axis
CLim2 = get(ax2,'CLim');
定义一个函数来计算 CLim 值
计算 CLim 的新值涉及确定您希望每个轴相对于总颜色图大小使用的颜色图部分,并相应地缩放其 Clim 范围。您可以定义一个 MATLAB 函数来执行此操作。
function CLim = newclim(BeginSlot,EndSlot,CDmin,CDmax,CmLength)
% Convert slot number and range
% to percent of colormap
PBeginSlot = (BeginSlot - 1) / (CmLength - 1);
PEndSlot = (EndSlot - 1) / (CmLength - 1);
PCmRange = PEndSlot - PBeginSlot;
% Determine range and min and max
% of new CLim values
DataRange = CDmax - CDmin;
ClimRange = DataRange / PCmRange;
NewCmin = CDmin - (PBeginSlot * ClimRange);
NewCmax = CDmax + (1 - PEndSlot) * ClimRange;
CLim = [NewCmin,NewCmax];
end
输入参数在上面的项目符号列表中标识。该函数首先计算要用于特定轴 (PCmRange) 的总颜色图的百分比,然后在给定轴中的 CData 范围的情况下计算使用该部分颜色图所需的 CLim 范围。最后,它确定计算的 CLim 范围所需的最小值和最大值并返回这些值。这些值是给定轴的颜色限制。
使用功能
使用 newclim 函数设置每个轴的 CLim 值。该声明
set(ax1,'CLim',newclim(BeginSlot1,EndSlot1,CLim1(1),...
CLim1(2),CmLength))
设置第一个轴的 CLim 值,因此表面使用颜色槽 65 到 120。光照表面使用较低的 64 个槽。您还需要重置其 CLim 值。
set(ax2,'CLim',newclim(BeginSlot2,EndSlot2,CLim2(1),...
CLim2(2),CmLength))
函数的工作原理
MATLAB 允许您为坐标区 CLim 属性指定任何值,即使这些值与坐标区中显示的图形对象的 CData 不对应。最小 CLim 值始终映射到颜色图中的第一种颜色,而最大 CLim 值始终映射到颜色图中的最后一种颜色,无论是否真的有任何 CData 值对应于这些颜色。因此,如果您为 CLim 指定的值超出对象的实际 CData 最小值或最大值,MATLAB 将仅使用颜色图的子集为对象着色。
newclim 函数计算 CLim 的值,将图形对象的实际 CData 值映射到您指定的开始和结束颜色映射槽。它通过定义一个具有计算出的 CLim 值的“虚拟”图形对象来做到这一点。