Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法

简介

在制作colorbar的时候,对于超过一定范围的数据,需要用同一个颜色进行表示,此时颜色条应该带有尖角。有时候碰到需要设置不均匀间隔的colorbar又的进行设置。目前Matlab自带colorbar不能很好完成上述需求,下面对从网络上找到的集中方法进行一个汇总。不同方法具有不同的应用场景。

方法1——不等距离且带箭头

基于M_map工具实现。该工具的具体安装使用可以参考前面博文中内容。
核心代码:

[CS,CH]=m_contourf(LN,LT,prate'*1e3,[0.05:.05:.7],'edgecolor','none');
ax=m_contfbar([.3 .7],.05,CS,CH);

效果:
Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法_第1张图片
优点:带箭头,支持不等间距。
缺点:不等间距时colorbar上颜色也不等间距,并且对于无限小区间的数据用白色表示。该缺点对于很多数据不可接受。

方法2——不等间距colorbar实现

来自气象家园,运行需要M_map。
优点:支持不等间距。
缺点:不带箭头。

clear all;close all;clc

load('data.mat')

load('map.mat');

space_shp=0.05;

xi=round(min(x_gz))-1:space_shp:round(max(x_gz))+1;

yi=round(min(y_gz))-1:space_shp:round(max(y_gz))+1;

[XI,YI]=meshgrid(xi,yi);

ZI1=interp2(lon,lat,data,XI,YI,'nearest');    % 'linear''nearest''natural''cubic''v4'。默认方法为 'linear'

isin=inpolygon(XI,YI,x_gz,y_gz);

ZI1(~isin)=NaN;
%% 降水量不等间距填色图
% %降水量颜色设置
cmap=[255 255 255; 150 255 150; 50 146 60; 100 184 244;...      
    0 0 241; 255 0 255; 192 0 100;192 100 100;]/255;

level = [0,0.1,10,25,50,100,200,250] ;

[~,ZI2]=histc(ZI1,level);

ZI2=ZI2-1;
%% 绘图
figure('position',[50 50 800 600]);

m_proj('mercator','lon',[103,110],'lat',[24,30]);

[cs,h2]=m_contourf(XI,YI,ZI2,'LineWidth',0.5);  hold on  % --------------------------

set(h2,'LineStyle','none');

shading flat;           %填充平滑

colormap(cmap) ;

caxis([0 length(level)]) ;

cbar = colorbar;

set(cbar,'Ticks',0:length(level)-1,'TickLabels',level) ;

set(cbar,'TickLength',0);

m_plot(x_gz2,y_gz2,'LineWidth',0.5,'Color','k');

set(gca,'FontSize',8);

m_grid('linest','none','tickdir','in');

xlabel('经度');

ylabel('纬度');

title1=strcat('24h降水量');

title(title1,'FontSize',8);

print('-dpng',strcat(title1,'.png'));

hold off

Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法_第2张图片

方法3——带箭头等间距

出自Matlab论坛,转自气象家园。
优点:带箭头。
缺点:不支持不等间距,且颜色无限小时候为白色,经实测生成的图看着不漂亮。

Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法_第3张图片

方法4——不等间距不带箭头

来自气象家园,该方法与另一个帖子效果一致。
优点:效果不错。
缺点:通过区间划分的方式进行绘制,不带箭头。

Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法_第4张图片

方法5——不能间距且带箭头

来自气象家园。
优点:支持不等间距,且带箭头,效果堪称完美。
注意:绘图时候需要自定义位置。结合M_map工具绘制非等间距效果完美。
调用例子1:

tick=-20:5:20;
color=[69 117 180;116 173 203;171 217 233;254 224 144;253 174 77;244 109 67;215 48 39;165 0 38]/255;
mode='h';
colorbarn(tick,color,mode)

Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法_第5张图片

调用例子2:

color=[131 0 162;160 0 198;109 0 219;31 60 249;0  160 230;0 198 198;0 209 139;0 219 0;160 230  51;230 219 51;230 175 45;239 130 41;239 0 0;219  0 98;255 1 118]/255;
tick=515:5:590;
mode='v';

%----------------------------------------------------------
%lon lat data_9是绘图数据</font>
[ax1,c,h]=contf_line(lon,lat,data_9,tick,color,mode);
set(gca,'fontname','Times New  Roman','fontsize',16,'fontangle','italic');
set(c,'fontname','Times New Roman','fontsize',14)

Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法_第6张图片
函数代码:

function [ax1,c] = colorbarn(tick,color,mode)
%---------------------------------
%带尖端的colorbar
%[ax1,c] = COLORBARN(tick,color,mode)
%坐标轴句柄是c,绘图窗句柄是ax1
%详情请参考函数 [ax1,c,h]=contf_line(lon,lat,X,tick,color,mode)
%---------------------------------
[m,~]=size(color);
len_tick=length(tick);
if len_tick-m ~= 1
    return
end
figure;
set(gcf,'color','w');
if isequal(mode,'h')
    c=axes('position',[0.1 0.1 0.8 0.03]);
    cdata=zeros(1,m);
    for i=1:m
        cdata(i)=(tick(i)+tick(i+1))/2;
    end
    axis([0 m 0 1])
    line([0 1],[0 0],'linewidth',2,'color','w','parent',c)
    line([m-1 m],[0 0],'linewidth',2,'color','w','parent',c)
    colormap(color);
    %------------------------
    pat_v1=[1 0;1 1;2 1;2 0];pat_f1=reshape(1:(m-2)*4,4,m-2)';
    for j=2:m-2
        pat_v1=[pat_v1;[j 0;j 1;j+1 1;j+1 0]];
    end
    pat_col1=[cdata(2:end-1)]';
    patch('Faces',pat_f1,'Vertices',pat_v1,'FaceVertexCData',pat_col1,'FaceColor','flat');
    %--------------------------------------------------   
    pat_v2=[0 0.5;1 0;1 1;m-1 1;m-1 0;m 0.5];
    pat_f2=[1 2 3;4 5 6];
    pat_col2=[cdata(1);cdata(end)];
    patch('Faces',pat_f2,'Vertices',pat_v2,'FaceVertexCData',pat_col2,'FaceColor','flat');
    %---------------------------------------------------------
    set(c,'color','none','xcolor','k','ycolor','none');
    box off
%     line([1 m-1],[0 0],'color','k')
%     line([1 m-1],[1 1],'color','k')
%     for i=2:m-2
%         line([i i],[0 1],'color','k')
%     end
    set(c,'xtick',1:m-1,'xticklabel',num2cell(tick(2:end-1)),'ytick',[])
    ax1=axes('position',[0.1 0.2 0.8 0.7]);
elseif isequal(mode,'v')
    c=axes('position',[0.87 0.11 0.02 0.81]);
    set(c,'yaxislocation','right');
    cdata=zeros(1,m);
    for i=1:m
        cdata(i)=(tick(i)+tick(i+1))/2;
    end
    axis([0 1 0 m])
    line([1 1],[0 1],'linewidth',2,'color','w','parent',c)
    line([1 1],[m-1 m],'linewidth',2,'color','w','parent',c)
    colormap(color);
    %--------------------------------------------
    pat_v1=[0 1;1 1;1 2;0 2];pat_f1=reshape(1:(m-2)*4,4,m-2)';
    for j=2:m-2
        pat_v1=[pat_v1;[0 j;1 j;1 j+1;0 j+1]];
    end
    pat_col1=[cdata(2:end-1)]';
    patch('Faces',pat_f1,'Vertices',pat_v1,'FaceVertexCData',pat_col1,'FaceColor','flat');
    %--------------------------------------------------   
    pat_v2=[0.5 0;1 1;0 1;1 m-1;0.5 m;0 m-1];
    pat_f2=[1 2 3;4 5 6];
    pat_col2=[cdata(1);cdata(end)];
    patch('Faces',pat_f2,'Vertices',pat_v2,'FaceVertexCData',pat_col2,'FaceColor','flat');
    %------------------------------------------------------
    set(c,'color','none','xcolor','none','ycolor','k');
    box off
    set(c,'ytick',1:m-1,'yticklabel',num2cell(tick(2:end-1)),'xtick',[])
    ax1=axes('position',[0.11 0.11 0.74 0.81]);
else
    disp('colorbarn格式出错')
    return
end

end



function [ax1,c,h]=contf_line(lon,lat,X,tick,color,mode)
% ---------------------------------
%contourf()绘图,带尖端的colorbar
%[ax1,c,h]=CONTF_LINE(lon,lat,X,tick,color,mode)
% 
%tick的个数比color的行数多一个
%ax1控制绘图窗,c控制colorbar,h控制contourf函数
%--------
%修改colorbar间隔:
%lab=get(c,'x/yticklabel');
%lab(2:2:end)={' '};
%set(c,'x/yticklabel',lab);
%--------
%copyright 傅辉煌
% ----------------------------------------


[m,~]=size(color);
len_tick=length(tick);
if len_tick-m ~= 1
    return
end
[ax1,c]=colorbarn(tick,color,mode);
[~,h]=contourf(lon,lat,X);
set(h,'levellist',tick,'linecolor','none');
colormap(color);
caxis([tick(1) tick(end)])
end


总结

推荐使用最后一种方法,效果最好。

参考

http://bbs.06climate.com/forum.php?mod=viewthread&tid=51247&extra=page%3D4
http://bbs.06climate.com/forum.php?mod=viewthread&tid=49521&typeid=12
https://blog.csdn.net/weixin_42614163/article/details/99677492
http://bbs.06climate.com/forum.php?mod=viewthread&tid=46894&highlight=colorbar

你可能感兴趣的:(MATLAB,colorbar)