Matlab:如何为同一图形中的不同曲面指定不同的颜色贴图/颜色条
我对Matlab相当陌生,有几个问题。 在同一个图形中有两个曲面和一个平面。 我想对b使用不同的颜色映射和颜色条,对c使用另一种颜色映射和颜色条。s是固定颜色,所以这不是问题 让我试着解释一下我想要实现的目标: cmap1=colormap(topobathy)-->cmap1是预期的64x3倍 cmap2=彩色地图(红白绿) 使用cmap1创建CData(这是我无法理解的第一部分,如何使用cmap1缩放z数据,默认情况下CData包含z值) b=surf(x,y,z,cdata1) 颜色条用于使用z值的b c=pcolor(x,y,(z-z0))-我想用cmap2来做这个 颜色条用于使用(z-z0)值的c 以下是我到目前为止遇到的问题Matlab:如何为同一图形中的不同曲面指定不同的颜色贴图/颜色条,matlab,matlab-figure,color-mapping,Matlab,Matlab Figure,Color Mapping,我对Matlab相当陌生,有几个问题。 在同一个图形中有两个曲面和一个平面。 我想对b使用不同的颜色映射和颜色条,对c使用另一种颜色映射和颜色条。s是固定颜色,所以这不是问题 让我试着解释一下我想要实现的目标: cmap1=colormap(topobathy)-->cmap1是预期的64x3倍 cmap2=彩色地图(红白绿) 使用cmap1创建CData(这是我无法理解的第一部分,如何使用cmap1缩放z数据,默认情况下CData包含z值) b=surf(x,y,z,cdata1) 颜色条用于
b=surf(x,y,z);
colormap(topobathy);
cbar1=colorbar;
set(get(cbar1,'ylabel'),'String', 'Elevation (m)', 'Rotation', 90)
hold on;
s=surf(x,y,z1,'FaceColor',[0.278 0.788 0.788])
hold on;
change=z-z0;
c=pcolor(x,y,change)
set(c,'ZData',100 + 0*change); %plotting it above the other surfaces
colormap(redwhitegreen)`
此时,对于b,colormap设置为红白绿色,colorbar设置为b
我无法用自己的clim等获得第二个颜色条
我使用了此链接中解释的冻结颜色和cbfreeze:
但一件事起作用,而另一件事却弄糟了(可能都是我的错)。我想学习如何在不使用外部m文件的情况下完全控制我的对象
非常感谢您的帮助。基本思想是连接颜色贴图,然后移动/缩放不同打印句柄的颜色数据(
CData
),以与颜色贴图的所需部分对齐。因此,在不知道自定义函数或特定数据是什么的情况下,您可以执行类似于colormap(topobathy(64);redwhitegreen(64))
的操作,然后将b
的CData
缩放到[1,64]范围,将c
的缩放到[65128]范围
MathWorks网站上有一个很好的指南解释了所有这些(甚至像您的示例一样使用surf()
和pcolor()
):
对于颜色栏,您可以用类似的方式伪造记号和标签。下面是为上述示例制作颜色条的粗略示例:
h = colorbar;
ticks = [1 16:16:64 64:16:128];
ticks(5:6) = [62 66];
set(h, 'YTick', ticks);
labels = num2str(repmat(linspace(min(Z(:)), max(Z(:)), 5), 1, 2)', 2);
set(h, 'YTickLabel', labels)
我和你有同样的问题,我找到的最好(也是唯一)解决方案是下一个:
连接我想要的两个颜色贴图:
cmap1=jet(64);cmap2=铜(64);颜色映射=[cmap1;cmap2]
因此,第一个颜色映射(cmap1
)将用于Axes1,第二个颜色映射(cmap2
)将用于Axes2。我猜Axes1和Axes2在同一个图中
规范化数据,为Axes1的数据提供从0到1的刻度,为Axes2的数据提供从1到2的刻度。[0,1]中的Axes1和[12]中的Axes2
data1=data1-下限1;
数据1=双精度(数据1./(上限1-下限1))
对于轴2的数据集:
代表他们时:
- Axes1:
- Axes2:
根据需要使用pcolor或surf。
希望有帮助 Matlab为函数newclim提供了代码,该函数通过将颜色贴图连接到一个颜色贴图中干净地解决了这个问题。我只能在2012b帮助中找到此文档,但不能在网上找到
请注意,在最后一步中用于更新CLim的轴可能是用于浏览绘图的轴,这就是我应用此代码的方式
计算颜色限制
本示例的关键是计算CLim的值,这些值使每个曲面使用包含适当颜色的colormap部分
要计算CLim的新值,您需要知道
- 颜色贴图的总长度(CmLength)
- 用于每个轴的起始颜色贴图槽(BeginSlot)
- 用于每个轴的结束颜色贴图插槽(EndSlot)
- 包含的图形对象的最小和最大CData值
在轴线上。也就是说,已确定轴CLim特性的值
当CLimMode是自动的(CDmin和CDmax)时,使用MATLAB
首先,定义子地块区域并绘制曲面
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使您能够为axes CLim属性指定任何值,即使这些值与axes中显示的图形对象的CData不对应。最小CLim值始终映射到colormap中的第一种颜色,最大CLim值始终映射到colormap中的最后一种颜色,无论是否存在与这些颜色对应的任何CData值。因此,如果为CLim指定的值超出了对象的实际CData最小值或最大值,则MATLAB仅使用colormap的一个子集为对象着色
colormap([im1.map;im2.map])
纽克利
set(ax1,'CLim',newclim(BeginSlot1,EndSlot1,CLim1(1),...
CLim1(2),CmLength))
set(ax2,'CLim',newclim(BeginSlot2,EndSlot2,CLim2(1),...
CLim2(2),CmLength))