爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14506|回复: 6

[程序设计] MATLAB-绘制不等间隔的colorbar和填色图

[复制链接]

新浪微博达人勋

发表于 2022-9-28 13:25:01 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 huihuang 于 2022-9-28 16:01 编辑

不等间隔的colorbar在气象中有许多实际的用途,比如降水图和p值检验。最近在研究怎么在MATLAB上绘制这样一种图像

以前本科时试过这样一种做法,以降水为例:
  1. tick = [0,0.1,10,25,50,100,200];
复制代码
将降水数据进行分段变换,使其间隔变为:
  1. tick = [0,1,2,3,4,5,6];
复制代码
比如所有真实场位于[0 0.1]区间上的数据,执行变换:y = 10*x
所有真实场位于[100 200]区间上的数据,执行变换:y = x/100 + 4
那么原来范围为[0 200]的真实数据将变换为范围为[0 6]的虚假数据,将这一虚假数据绘制出来,并将colorbar对应的tick稍微修改,则能形成一张不等间隔的图。

但这一做法比较麻烦,而且需要修改原始数据,在数据较少的情况下,还会有等值线出现锯齿的问题

最近研究出一种新方法,下面的演示例子为MATLAB自带的矩阵peaks,其大小为49x49,数据范围为[-6.55 8.08],下面为其空间结构
  1. load Color.mat
  2. [x,y] = meshgrid(1:49,1:49);

  3. figure;
  4. contourf(x,y,peaks,'LevelList',-10:10,'LineColor','w','LineWidth',1)
  5. caxis([-6 8])
  6. colormap(Color)
复制代码
a.png   -----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
下面我们来看一下使用contourf只画一条等值线的情况
  1. figure;
  2. contourf(x,y,peaks,'LevelList',[-4 -4],'FaceColor','b')
复制代码
b.png
可以发现,在比-4小的区域,不填色,而在比-4大的区域,填上指定的颜色(蓝色)。那么,如果我们重复上述步骤,将其他区域用同样的办法填上颜色:
  1. hold on
  2. contourf(x,y,peaks,'LevelList',[1 1]*-3,'FaceColor','g')
  3. contourf(x,y,peaks,'LevelList',[1 1]*0,'FaceColor','c')
复制代码
c.png
  1. contourf(x,y,peaks,'LevelList',[1 1]*1,'FaceColor','k')
  2. contourf(x,y,peaks,'LevelList',[1 1]*2,'FaceColor','m')
  3. contourf(x,y,peaks,'LevelList',[1 1]*4,'FaceColor','y')
  4. contourf(x,y,peaks,'LevelList',[1 1]*7,'FaceColor','r')
复制代码
d.png
这样,将上述步骤整理封装为一个函数(contourf_ueq.m),我们就能很方便地绘制不等间隔的填色图。下面我们看一下实际效果:
  1. tick = [-6:2:0 1:3 5 7];
  2. Color = Color([1 3 5 7:9 11 13],:);

  3. figure;
  4. contourf_ueq(x,y,peaks,tick,Color,'LineColor','w','LineWidth',1);
  5. cb = colorbar;
复制代码
e.png
可以看见,图像和colorbar并没有对应,我们可以手动修改一下:
  1. colormap(Color);caxis([1 length(tick)])
  2. set(cb,'Ticks',1:length(tick),'TickLabels',tick)
复制代码
f.png
或者直接调用我的上一篇文章中的函数colorbarn(点我跳转)
  1. tick = [-6:2:0 1:3 5 7];
  2. Color = Color([1 3 5 7:9 11 13],:);

  3. figure;
  4. contourf_ueq(x,y,peaks,tick,Color,'LineColor','w','LineWidth',1);
  5. tick2 = setdiff(-10:10,tick);
  6. hold on
  7. contour(x,y,peaks,'LevelList',tick2,'LineWidth',1,'LineColor','k')
  8. cb = colorbarn(tick,Color);
复制代码
g.png
但是这种方法也存在一个缺点:由于是多个contourf函数叠加而成,暂时还没有找到统一修改句柄的方法,希望以后能够解决











test_contourf_ueq.rar

1.06 MB, 下载次数: 31, 下载积分: 金钱 -5

评分

参与人数 2金钱 +30 贡献 +1 收起 理由
今天 + 20 + 1
lleoiu + 10 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2022-9-28 13:46:16 | 显示全部楼层
哇哦 学到了大佬太厉害啦 求加个联系方式
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-9-28 13:48:33 来自手机 | 显示全部楼层
楼主好棒呀
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-9-28 15:25:17 | 显示全部楼层
谢谢楼主分享,感觉matlab资源还是要少好多啊
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-10-17 11:20:04 | 显示全部楼层
太需要了,这相当于把contourf中实现等间距的现在设置成不等间距
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-3-24 21:10:25 | 显示全部楼层
帮大忙了,感谢分享!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-4-14 16:30:50 | 显示全部楼层
非常不错的帖子哟,值得收藏
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表