爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 67022|回复: 57

[讨论] 如何用matlab设置不等间隔的colorbar

  [复制链接]

新浪微博达人勋

发表于 2016-8-14 22:27:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 雾失流年 于 2016-8-20 15:32 编辑

用matlab已经近一年了,但是colorbar的调节问题一直是我的心头大患每次碰到需要设置不均匀间隔的colorbar只能求助于ncl了希望有大神能给个指点,一直都相信matlab也是可以画出理想中的图的
我用matlab画分布图的时候如下(图1),colorbar是均匀分布的,刻度也是均匀分布的
但是我现在希望可以得到像ncl的colorbar一样可以随意分配哪个数字间隔使用哪个颜色?不知道有没有人做过这个?------------------------------------分割线-------------------------------------------------------------------------------------------------
非常感谢7楼@thukd35 的帮助,现在问题已经解决啦所以前来更新一下
在做colorbar的时候希望将所有的负值变成一个颜色(负值意义不大),突出正值的变化,因此需要设置一个不等间隔的colorbar。
首先要创造一个colormap(这里使用了气象家园上某人的colomap。。。一时之间没搜到,就这样吧
%创造colormap,第一个颜色是蓝色,下面十个颜色是渐变的橙色
aa = othercolor('BuOr_8',20);
aa(1:8,:) = [];
aa(2,:) = [];
然后就按照thukd35的方法将矩阵的值设置成你想要画的几个间隔
%将原始数据处理成11个色
bcc_dis(find(bcc_dis<0)) = -0.5;
bcc_dis(find(bcc_dis>=0&bcc_dis<0.1)) = 0.5;
bcc_dis(find(bcc_dis>=0.1&bcc_dis<0.2)) =1.5;
bcc_dis(find(bcc_dis>=0.2&bcc_dis<0.3)) = 2.5;
bcc_dis(find(bcc_dis>=0.3&bcc_dis<0.4)) = 3.5;
bcc_dis(find(bcc_dis>=0.4&bcc_dis<0.5)) = 4.5;
bcc_dis(find(bcc_dis>=0.5&bcc_dis<0.6)) = 5.5;
bcc_dis(find(bcc_dis>=0.6&bcc_dis<0.7)) = 6.5;
bcc_dis(find(bcc_dis>=0.7&bcc_dis<0.8)) = 7.5;
bcc_dis(find(bcc_dis>=0.8&bcc_dis<0.9)) = 8.5;
bcc_dis(find(bcc_dis>=0.9&bcc_dis<1)) = 9.5;

在这里为了方便起见,所有小于0的数设置成-0.5,0-0.1之间的设置成0.5,确定区间画颜色更明了一些
最后就是更改colorbar的tick
%修改colorbar
colormap(aa)
h = colorbar;
caxis([-1,10]);
h.Ticks = -1:10;
h.TickLabels = [-1,0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1];
set(h,'location','southoutside')

这样设置就保证了所有小于0的数都变成了-0.5,且落在区间[-1,0],其标签对应了-1-0;所有0-0.1之间的数变成了0.5,落在区间[0,1],其标签对应了0-0.1
不会贴代码将就着看看吧



原始分布图,由于负值地区意义不大,想将所有负值地区变成一个颜色

原始分布图,由于负值地区意义不大,想将所有负值地区变成一个颜色

将所有负值变成统一的蓝色,正值区是橙色

将所有负值变成统一的蓝色,正值区是橙色

评分

参与人数 3金钱 +50 贡献 +8 收起 理由
nuist2015 + 20
kongfeng0824 + 10 + 6 很给力!
wlzhongouc + 20 + 2

查看全部评分

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

新浪微博达人勋

发表于 2017-4-20 18:22:29 | 显示全部楼层
狼人杀 应不应该悍跳
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 3

使用道具 举报

新浪微博达人勋

发表于 2016-8-17 10:39:28 | 显示全部楼层
本帖最后由 thukd35 于 2016-8-17 10:42 编辑
雾失流年 发表于 2016-8-17 10:08
非常感谢。不知道我有没有理解错,比如一个73*144的矩阵,数据分成4类的意思是重新生成4个矩阵,然后每个 ...

一个简单的例子哈,a=randi(4,4),生成一个4*4的只有1,2,3,4的矩阵,然后画图,修改colorbar
  1. imagesc(a);
  2. colormap(parula(4));
  3. h=colorbar;caxis([1 5]);
  4. h.Ticks=1:5;
  5. h.TickLabels=[0,1,10,50,100]
复制代码
数据和效果图是这样

捕获1.JPG
捕获3.JPG
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2017-11-12 10:37:55 | 显示全部楼层
゛绍〤z、 发表于 2017-11-11 22:15
偶然看到这个帖子,发现楼主犯了个小错误,
bcc_dis(find(bcc_dis=0&bcc_dis=0.5&bcc_dis=0.5&bcc_dis=0&b ...

嗯,对的我也发现了,后面懒得改了
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2016-8-14 23:53:34 | 显示全部楼层
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2016-8-15 07:31:28 | 显示全部楼层
学习学习   好贴好回复
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-15 11:28:21 | 显示全部楼层
你说的想法需要自己去调色,并进行绘图控制,colormap根据自己的需求去绘制即可。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-15 12:02:47 | 显示全部楼层
479336356 发表于 2016-8-15 11:28
你说的想法需要自己去调色,并进行绘图控制,colormap根据自己的需求去绘制即可。

调色我会,图是我自己画的,只是想调一下colorbar,变成这样小于0的都是蓝色,大于0的等间隔分成渐变的红色。
ncl可以自己设置哪个颜色对应哪个数值,而matlab的colorbar目前还不会设置。
所以想问一下可否把colorbar设置成ncl一样不等间隔的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-15 18:51:42 | 显示全部楼层
学习学习   好贴好回复
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-17 09:09:40 | 显示全部楼层
额,楼主,我说一下我自己的处理方法哈,把你要画图的二维数据矩阵,根据数据范围,自己设置不规则区间,比如数据范围是0~100,分成不规则区间,比如0~1,1~10,10~50,50~100这么四个区间,相当于把原始数据按照这四个区间分成四类,然后你把自己的colormap也设置成形状为4*3的矩阵,然后用这个分类后的数据画图就行啦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-17 10:08:34 | 显示全部楼层
thukd35 发表于 2016-8-17 09:09
额,楼主,我说一下我自己的处理方法哈,把你要画图的二维数据矩阵,根据数据范围,自己设置不规则区间,比 ...

非常感谢。不知道我有没有理解错,比如一个73*144的矩阵,数据分成4类的意思是重新生成4个矩阵,然后每个矩阵里只有这个区间(0~1,或1~10)的数,其余都是nan吗?这时的colormap是4个颜色没错,可是画colorbar的时候可以直接调用colorbar吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-17 10:28:39 | 显示全部楼层
雾失流年 发表于 2016-8-17 10:08
非常感谢。不知道我有没有理解错,比如一个73*144的矩阵,数据分成4类的意思是重新生成4个矩阵,然后每个 ...

额,理解稍微有一点点偏差。数据量不大的话,可以写一个循环,把原始数据的值根据不同的区间重新赋值,比如接着之前的例子,0~1的值赋成1,1~10的值赋成2,10~50的值赋成3,50~100的值赋成4,这样你可以形成一个73*144的只有1,2,3,4这四个值的数据矩阵,然后用这个矩阵画图,如果你的colormap只有四行的话,是可以对应到这四个区间的。但是,如果你直接画colorbar的话,colorbar的刻度也只会是1,2,3,4这几个值,这时候需要调整colorbar的ticks和ticklabels,让它在0处标0,1处标1,2处标10,3处标50,4处标100,大概是这样的,ticks和ticklabels调的时候会有些问题,比如刻度和区间,如果有4个区间的话,应该会有5个刻度,还得你自己试着调整一下~
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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