转载请注明本文链接
及文章作者:slandarer
这个函数的主要作用是将colormap的中心点设置到0值处,以适应某些例如地理绘图时,海平面上方高度范围和下方高度范围不相等的情况。
具体使用方式和功能请见以下推送:MATLAB | 如何将colormap中心点置为0值处?
本文是关于setPivot
函数的一个小修改,我本来写这个函数是为了适配我自己写的SHeatmap函数,同时为了适应某些地理绘图库而制作的。
而由于本身MATLAB自带的heatmap函数算是一个小另类的函数,他居然不是画在axes上,直接画在figure上,这就很离谱,因为它作为一类图形居然是一个和一个画布是同级的东西,因此之前setPivot
通过找axes再去找CLim范围的方式就完全失效了,考虑到这一点,对原本的函数做了很简单的修改,就是让他try两次获取CLim属性,一次直接:
get(ax,'CLim');
而第二次则是:
get(ax,'ColorLimits');
这样离谱的有关自带heatmap函数的问题轻松解决,实际上就是把原本那一行代码改为了:
try
CLimit=get(ax,'CLim');
catch
end
try
CLimit=get(ax,'ColorLimits');
catch
end
hiahiahia要是之后遇到更妖孽的对象就再继续往后加获取CLim的方式就好,修改后的完整代码为:
function setPivot(varargin)
% @author:slandarer
if nargin==0
ax=gca;pivot=0;
else
if isa(varargin{1},'matlab.graphics.axis.Axes')
ax=varargin{1};
if nargin>1
pivot=varargin{2};
else
pivot=0;
end
else
ax=gca;pivot=varargin{1};
end
end
try
CLimit=get(ax,'CLim');
catch
end
try
CLimit=get(ax,'ColorLimits');
catch
end
% CMap=get(ax,'Colormap');
CMap=colormap(ax);
CLen=[pivot-CLimit(1),CLimit(2)-pivot];
if all(CLen>0)
[CV,CInd]=sort(CLen);
CRatio=round(CV(1)/CV(2).*300)./300;
CRatioCell=split(rats(CRatio),'/');
if length(CRatioCell)>1
Ratio=[str2double(CRatioCell{1}),str2double(CRatioCell{2})];
Ratio=Ratio(CInd);
N=size(CMap,1);
CList1=CMap(1:floor(N/2),:);
CList2=CMap((floor(N/2)+1):end,:);
if mod(N,2)~=0
CList3=CList2(1,:);CList2(1,:)=[];
CInd1=kron((1:size(CList1,1))',ones(Ratio(1)*2,1));
CInd2=kron((1:size(CList2,1))',ones(Ratio(2)*2,1));
CMap=[CList1(CInd1,:);repmat(CList3,[Ratio(1)+Ratio(2),1]);CList2(CInd2,:)];
else
CInd1=kron((1:size(CList1,1))',ones(Ratio(1),1));
CInd2=kron((1:size(CList2,1))',ones(Ratio(2),1));
CMap=[CList1(CInd1,:);CList2(CInd2,:)];
end
% set(ax,'Colormap',CMap)
colormap(ax,CMap);
end
end
end
对于自带heatmap使用一下试试,将colormap中心点置为6处:
heatmap(peaks(25)+1)
% 随便构造一个colormap
CM=[0.1874 0.0771 0.2162
0.2881 0.0832 0.3962
0.3604 0.2090 0.6047
0.3734 0.3827 0.7065
0.4129 0.5397 0.7472
0.5390 0.6785 0.7712
0.7421 0.7976 0.8227
0.8856 0.8499 0.8857
0.8391 0.7587 0.7108
0.7905 0.5986 0.4866
0.7382 0.4192 0.3485
0.6433 0.2587 0.3124
0.4974 0.1354 0.3141
0.3126 0.0789 0.2669
0.1849 0.0794 0.2131];
colormap(CM)
setPivot(6)
右侧colormap的颜色中心确实被移动到了6处,没毛病哈。
存有此函数的仓库也对代码做出了修改,请见:
https://gitee.com/slandarer/slanColor