爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 62751|回复: 33

[程序设计] Matlab绘制不等间距数据的等距colorbar的方法

  [复制链接]

新浪微博达人勋

发表于 2017-3-15 11:59:09 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 bene1989 于 2017-3-15 16:45 编辑

自己曾因为如何在Matlab中设置nonlinear类型的colorbar困扰了近一个星期的时间,也在网上找了几个方法,但发现这些方法都有这样那样的问题,下面是本人曾试过的两种方法:


方法一:更改colormap (https://cn.mathworks.com/matlabcentral/newsreader/view_thread/237071)。
China_MTE_GPP2.jpg 使用该方法所得的图如上所示,虽然能够准确表示不同区间数据的颜色,但是colorbar的间隔并不均匀,并且在数据间隔较大时,产生的colormap数量太多,故该方法不具有普适性。


方法二: 只更改colorbar的Ticks (http://bbs.06climate.com/forum.p ... tid=49521&typeid=12)。

选用网友提供的没有使用creatColor.m函数的方法,即在colorbar根据数据levels的大小单纯将colorbar的Ticks设置为等差数列,然后将[size=12.1387px]TickLabels设置为要表示的数据数据,所得结果如下图所示
China_MTE_GPP1.jpg
所得结果是错误的,因为TickLabels所标注的数值不等于色标所表示的真实值(或者说TickLabels与其要表示的真实值间没有对应关系)

自己的方法:根据选择的不等距数据区间更改所用的绘制数据,然后设置colorbar的TickLabels。


绘图要求:根据数据draw_data绘制其在中国区域内的空间图。按照dlevels=[0,50,200,500,800,1000,1500,2000,3000,4000]的不等距数据间隔绘制等距的colorbar,以分别准确表示0-50,50-200, ... , 3000-4000区间内的数据颜色。

核心思路:既然Maltab中的colorbar只能以等差数列绘制等距色标,那就将
draw_data根据dlevels的数据范围设置为等差数据,毕竟我们只要颜色的空间图,与真实数据对应就好,核心代码如下:


dlevels = [0,50,200,500,800,1000,1500,2000,3000,4000] ;
   
for k = 1 : length(dlevels) - 1
     
   draw_data(find(draw_data>dlevels(k) & draw_data<=dlevels(k+1))) = k ;
   
end

   draw_data(find(draw_data==dlevels(1))) = 1 ;


   cmap = colormap(jet(length(dlevels) - 1)) ;
   
   colormap(cmap) ;
   
   caxis([0 length(dlevels)-1]) ;
   
   cbar = colorbar ;
   
   set(cbar,'Ticks',[0,1,2,3,4,5,6,7,8,9],'TickLabels',dlevels) ;


所得结果如下:
China_MTE_GPP3.jpg
为保证colorbar的刻度线与不同颜色的分界线对应,要注意colormap设置的颜色数量,其它任意的不等距数据绘制等距colorbar的方法大家可以举一反三。








评分

参与人数 2金钱 +16 贡献 +8 收起 理由
kongfeng0824 + 6 + 4
Aires + 10 + 4

查看全部评分

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2017-10-22 07:37:23 | 显示全部楼层
这种方法要是画的经纬度范围大的话还好说,要是范围小的话,出来的图线条不会是平滑的,毕竟就那么几个数。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2017-3-15 13:41:37 | 显示全部楼层
学习了,厉害的大神
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-15 14:08:23 | 显示全部楼层
自己ai一个colorbar多好~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-15 20:24:27 | 显示全部楼层
谢谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-12 16:01:50 | 显示全部楼层
本帖最后由 nuisttony 于 2017-5-12 17:05 编辑

这个也会有问题;如果dlevels 中的数值小于length(dlevels),会执行draw_data(find(draw_data>dlevels(k) & draw_data<=dlevels(k+1))) = k 时,重复赋值,导致出错。

draw_data后面在哪里用到啊?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-21 21:37:53 | 显示全部楼层
这个方法是正确的,赞一个
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-6-2 16:13:07 | 显示全部楼层
nuisttony 发表于 2017-5-12 16:01
这个也会有问题;如果dlevels 中的数值小于length(dlevels),会执行draw_data(find(draw_data>dlevels(k) & ...

是的,如果dlevels 中的数值小于length(dlevels),会执行draw_data(find(draw_data>dlevels(k) & draw_data<=dlevels(k+1))) = k 时,重复赋值,导致出错。这个问题我遇到过,最好将draw_data另拷贝给另一个值temp,再draw_data(find(temp>dlevels(k) & temp<=dlevels(k+1))) = k 。
   draw_data在绘图时用到的,程序没贴。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-8-23 10:03:11 | 显示全部楼层
学习了
         
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-26 16:53:19 | 显示全部楼层
感谢分享!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

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

本版积分规则

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

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

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