当前位置:   article > 正文

Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法_为什么很多人用尖头的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);
  • 1
  • 2

代码解释:
ax=m_contfbar([.3 .7],.05,levels,levels);水平bar
ax=m_contfbar(0.9, [.1 .9],levels,levels);垂直bar

效果:
在这里插入图片描述
优点:带箭头,支持不等间距。
缺点:不等间距时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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

在这里插入图片描述

方法3——带箭头等间距

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

在这里插入图片描述

方法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)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

调用例子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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
函数代码:

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

总结

推荐使用最后一种方法,效果最好。 最后一种方法提供了两端尖头的colorbar,如果需要单头或者无尖头的colorbar对最后一种方法相应代码重写即可。双尖端colorbar、上部单尖端、下单尖端和无尖端colorbar。这里是某全球数据,数据范围[0,103],图中对几种尖端不等间距colorbar进行了绘制。
在这里插入图片描述

可以对颜色条进一步修改增加颜色渐变范围
在这里插入图片描述

参考

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/593734
推荐阅读
相关标签
  

闽ICP备14008679号