在制作colorbar的时候,对于超过一定范围的数据,需要用同一个颜色进行表示,此时颜色条应该带有尖角。有时候碰到需要设置不均匀间隔的colorbar又的进行设置。目前Matlab自带colorbar不能很好完成上述需求,下面对从网络上找到的集中方法进行一个汇总。不同方法具有不同的应用场景。
基于M_map工具实现。该工具的具体安装使用可以参考前面博文中内容。
核心代码:
[CS,CH]=m_contourf(LN,LT,prate'*1e3,[0.05:.05:.7],'edgecolor','none');
ax=m_contfbar([.3 .7],.05,CS,CH);
效果:
优点:带箭头,支持不等间距。
缺点:不等间距时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论坛,转自气象家园。
优点:带箭头。
缺点:不支持不等间距,且颜色无限小时候为白色,经实测生成的图看着不漂亮。
来自气象家园,该方法与另一个帖子效果一致。
优点:效果不错。
缺点:通过区间划分的方式进行绘制,不带箭头。
来自气象家园。
优点:支持不等间距,且带箭头,效果堪称完美。
注意:绘图时候需要自定义位置。结合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)
调用例子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)
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