MATLAB | 关于setPivot函数的小修改(调节colormap中心位置)

文摘   其他   2023-08-11 14:21   山东  
请尊重原创劳动成果
转载请注明本文链接
及文章作者: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



slandarer随笔
slandarer个人公众号,目前主要更新MATLAB相关内容。
 最新文章