爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 91584|回复: 84

[源程序] MATLAB设置不等间距colorbar

  [复制链接]

新浪微博达人勋

发表于 2016-12-15 16:57:07 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Lighting 于 2017-5-21 20:37 编辑


2017.5.21   
      
声明:
     此程序在某些情况下的结果确实不尽如人意,因此为了防止造成不必要的影响,在找到完美解决方案之前关闭程序下载。

     最近看到有人提出了关于设置不等间距colorbar 的新用法,非常开心又有新的用法了。
     http://bbs.06climate.com/forum.php?mod=viewthread&tid=51247&extra=page%3D4
      帖子中提到本贴一楼提出的方法有问题,顿时让我感觉头顶浇了一盆冷水啊~赶紧再检查一下本贴提供的方法是不是也存在相同的问题。


2017.4.8 更新
之前的更新对比了 ncl 和 matlab 的不等间距设置,但ncl使用了lambert 投影,对比起来可能并不是很好,此次更新全部不加投影,对比pythonmatlabncl 不等间距colorbar的设置。

鉴于上传图片,效果不佳,因此脚本和对比图均放到网盘中。
https://pan.baidu.com/s/1kVA0HWN

个人感觉:matlab 和 ncl 设置的不等间距 colorbar 几乎没有区别,但python 设置的不等间距 colorbar 和 ncl及matlab设置的效果差异明显。仅提供测试,不作评价。


=====================================================================
           忙里偷闲把之前一直想实现的设置不等间距colorbar完成了,实现方法不能说是完美,只是利用patch命令重新绘制了一个颜色图,已经测试了一些colorbar类型的设置,暂时并没有出现严重问题
      既然已经完成了,现在特上传以便大家测试,欢迎提供测试结果,如有bug欢迎反馈。


  1. z = peaks(50);
复制代码
z的范围为[-6.5259  8.0436]
  1. % figure 1
  2. figure
  3. [c, h] = contourf(z, [floor(min(min(z))) 0 1 3 6 ceil(max(max(z)))], 'linestyle', '--');
  4. caxis([floor(min(min(z))) ceil(max(max(z)))])
  5. clabel(c, h)
  6. creatColor(h, [floor(min(min(z))) 0 1 3 6 ceil(max(max(z)))], jet(5))
复制代码
图1表示把小于0的设置为一个颜色,大于6的设置为一种颜色,其余自定义区间

                               
登录/注册后可看大图

  1. % figure 2
  2. figure
  3. [c, h] = contourf(z, [floor(min(min(z))) -6, -3, -1 0 1 3 6 ceil(max(max(z)))], 'linestyle', '--');
  4. caxis([floor(min(min(z))) ceil(max(max(z)))])
  5. clabel(c, h)
  6. creatColor(h, [floor(min(min(z))) -6 -3 -1 0 1 3 6 ceil(max(max(z)))], jet(8))
复制代码
图2表示小于-6设置为一种颜色,大于6的设置为一种颜色,其余区间分别对应

                               
登录/注册后可看大图

  1. % figure 3
  2. figure
  3. [c, h] = contourf(z, [-6, -3, -1 0 1 3 6 ceil(max(max(z)))], 'linestyle', '--');
  4. caxis([-6 ceil(max(max(z)))])
  5. clabel(c, h)
  6. creatColor(h, [ -6 -3 -1 0 1 3 6 ceil(max(max(z)))], jet(7)
复制代码
图3为大于6的设置为一种颜色,其余区间分别对应一种颜色。注意图中出现了一部分白色区域,这是因为白色区域是小于-6的区域,如果未指定颜色,matlab默认使用白色填充。

                               
登录/注册后可看大图

  1. % figure 4
  2. figure
  3. [c, h] = contourf(z, [-7, -3, -1 0 1 3 6], 'linestyle', '--');
  4. caxis([-7 6])
  5. clabel(c, h)
  6. creatColor(h, [ -7 -3 -1 0 1 3 6], jet(6))
复制代码
图4设置为小于-3的设置为一种颜色,大于6的为一种颜色,其余分别对应。


                               
登录/注册后可看大图

  1. % figure 5
  2. figure
  3. [c, h] = contourf(z, [floor(min(min(z))) -6 -3 -1 0 ceil(max(max(z)))], 'linestyle', '--');
  4. caxis([floor(min(min(z))) ceil(max(max(z)))])
  5. clabel(c, h)
  6. creatColor(h, [floor(min(min(z))) -6 -3 -1 0 ceil(max(max(z)))], jet(5))
复制代码
图5表示大于0的设置为一种颜色,小于-6为一种颜色,其余分别对应。

                               
登录/注册后可看大图


           以上使用的是jet中的颜色模式,关于颜色的设置,均可自定义目前仅支持RGB三元组。暂时不提供设置colorbar宽度等相关属性。
     
      关于可能需要的功能还没有具体想法,因此,此程序仅是一个雏形,如果各位有一些好的想法,欢迎提出。


creatColor.m

1.81 KB, 阅读权限: 255, 下载次数: 52, 下载积分: 金钱 -5

评分

参与人数 3金钱 +24 贡献 +10 收起 理由
马莉 + 2 很给力!但是createColor.m下载不下来
echotew + 2 赞一个!
二爷名声在外 + 20 + 10 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2017-4-5 08:21:43 | 显示全部楼层
Lighting 发表于 2017-4-1 11:58
我也看不出来。能否给出更详细的信息

就是在实验第一个例子的时候,出现这个错误,图片画出来了,但是colorbar是不正常的,一个空白的colorbar竖条:
错误使用 patch
输入参数的数目不足。

出错 creatColor (line 67)
pb = patch(sb, 'Faces',f,'Vertices',v,'FaceVertexCData',colors,'FaceColor','flat');

出错 test1 (line 7)
creatColor(h, [floor(min(min(z))) 0 1 3 6 ceil(max(max(z)))], jet(5))
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-8 14:16:38 | 显示全部楼层
canghaiyimi 发表于 2017-3-31 13:28
使用过程出现如下问题,
出错 creatColor (line 67)
pb = patch(sb, 'Faces',f,'Vertices',v,'FaceVertex ...

同样出现了这个问题,换个版本的matlab(我前面用2012b,后面换成2016a)就不报这个错了。
但是我在2016a上面也有个小问题,自己生成的color多于20个就会出现这样 QQ截图20170508142346.png 的多余空白,但colors少于等于20个的时候就没问题了。 QQ截图20170508142323.png
很感谢楼主~很好用~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-12-16 16:15:37 | 显示全部楼层
本帖最后由 zeroes 于 2016-12-16 16:16 编辑

此代码需要作者自己编写的程序添加,实现了想要的功能,挺好,如果能是colorbar的原汁原味则更好。实际上如果知道level和colormap后,操作很简单,就是把原来的colorbar的x(y)ticklabel手动修改为自己的level就好,可以不用creatcolor函数。
具体的实现方法如下:
% figure 5
figure
lev=[floor(min(z(:))) -6 -3 -1 0 ceil(max(z(:)))]
[c, h] = contourf(z, lev, 'linestyle', '--');
caxis([floor(min(min(z))) ceil(max(max(z)))])
clabel(c, h)
% creatColor(h, [floor(min(min(z))) -6 -3 -1 0 ceil(max(max(z)))], jet(5))
%  注释creatcolor函数后,以下为添加内容
colormap(jet(length(lev)-1));
hh=colorbar('colormap',jet(length(lev)-1));
pos=get(hh,'position');
if pos(4)>pos(3) % vertical
    ym=get(hh,'ylim');
    set(hh,'ytick',ym(1):(ym(2)-ym(1))/(length(lev)-1):ym(2),'yticklabel',lev);
else % horizontal
    xm=get(hh,'xlim');
    set(hh,'xtick',xm(1):(xm(2)-xm(1))/(length(lev)-1):xm(2),'xticklabel',lev);
end

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
Lighting + 20 + 2 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao
回复 支持 3 反对 1

使用道具 举报

新浪微博达人勋

发表于 2016-12-15 17:06:09 | 显示全部楼层
{:eb511:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2016-12-15 17:09:55 | 显示全部楼层
看看先 好东西
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-12-16 10:18:07 | 显示全部楼层
楼主给力!!!一直觉得matlab二维图没grads好看问题主要就出现在colorbar上..........
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-12-16 17:00:44 | 显示全部楼层
zeroes 发表于 2016-12-16 16:15
此代码需要作者自己编写的程序添加,实现了想要的功能,挺好,如果能是colorbar的原汁原味则更好。实际上如 ...

本想继续实现一个类似colorbar的功能的,但是这样看已经没有必要了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-12-16 23:18:28 | 显示全部楼层
学习一下,谢谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-12-20 09:33:59 | 显示全部楼层
Lighting 发表于 2016-12-16 17:00
本想继续实现一个类似colorbar的功能的,但是这样看已经没有必要了。

我也编写过通过patch实现不等距level的颜色标注,colorbar的好处是可以随时隐藏和恢复,colorbar可以随图变动colormap以及改动位置等。能实现自己的目的就是好的,条条大路通罗马
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-12-20 23:32:48 | 显示全部楼层
楼主给力!!!一直觉得matlab二维图没grads好看问题主要就出现在colorbar上..........
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-12-21 08:10:05 | 显示全部楼层
楼主威武,多谢多谢{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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