爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 45183|回复: 11

[经验总结] python matplotlib colorbar设置

[复制链接]

新浪微博达人勋

发表于 2018-12-10 22:45:08 | 显示全部楼层 |阅读模式

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

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

x
Matplotlib Colorbar设置
这两天一直在调整水深的colorbar,对colorbar的使用也有一定的理解,在这里写下来,一是怕自己忘记了,二是希望给大家能够借鉴,有所启发。
总的来说有三种方法:1、借鉴matplotlib自带的colormap reference2、使用python模块palettable里面的colormap3、截取自己感觉最合适的colorbmap中的一部分,制作新的colormap。当然还有第4中方法,就是参考matplotlib中的creating a colormap from a list of colors,从头开始制作一个全新的colormap(一般而言我不会这么干,一是因为借鉴已经做好的colormap,截取其中一部分,感觉更简单;二是自己对颜色本就不太敏感,经常蓝绿不分,对自己做出来的colormap没有信心……)
一般而言只需要前两种方法,就能够解决大部分的colorbar问题,除非是对colorbar的颜色有很深的要求,一般不会用到第3中方法(本人就是因为需要对颜色进行细致的控制,所以这两天才学会了方法123 ……)
1. 使用matplotlib自带的colormap
1,首先导入模块
Import matplotlib.pyplot as plt
2,在contourcontourf中使用cmap关键字
Plt.contourf(LON, LAT, ZETA, level, cmap=plt.get_cmap(‘Blues’), alpha=0.8, zorder=1)
至于coutour中每个参数的意义,我就不多说了,大家自己去查。其中plt.get_cmap(‘Blues’)指的是使用matplotlib.colors中的名为‘BLues’的colormap。至于其他的colormap可去官网查看。
图片1.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA079.tmp.jpg
图1 Bluescolorbar

(注,也可以使用这种方法选择‘Bluescolormap
From matplotlib import cm
Import matplotlib.pyplot as plt
cmap = cm. get_cmap(‘Blues’))
Plt.contourf(LON, LAT, ZETA, level, cmap=cmap, alpha=0.8, zorder=1)
建议使用这种方式,因为可以和下面的第2种,第3种有所关联。其实无所谓了,都挺简单)

Contour参数:
Colormap:
2. 使用palettable模块中的colormap
1,要使用这个模块,首先你的安装这个模块,
pip install palettable
2,导入模块
Import palettable
From matplotlib.colors import ListedColormap
3,选择colormap
cmap = ListedColormap(palettable.cmocean.sequential.Deep_20.mpl_colors)
注意后面的mpl_colors一定要加上,至于为啥,我也不清楚……
再告诉大家一个小技巧,可以在Deep_20后面加一个_r,即
cmap = ListedColormap(palettable.cmocean.sequential.Deep_20_r.mpl_colors)
表示colorbar反转
4,contourcontourf中使用cmap关键字
Plt.contourf(LON, LAT, ZETA, level, cmap=cmap, alpha=0.8, zorder=1)

让我们来看看这个里面有多少的colormap。总共有8大类,有些类里面还有一些子类(大概2-3个),
图片7.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA08A.tmp.jpg
2  8大类
图片8.png

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA08B.tmp.jpg
图3  3小类

可以看到这里面有关于海洋的colormap cmocean。来看看里面的colorbar长什么样。
图片4.png 图片3.png 图片2.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA08C.tmp.jpg
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA08D.tmp.jpg
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA09D.tmp.jpg
图4 cmocean :sequential中的colorbar
其中值得注意的是Cubehelix中可以定义自己的调色板palette,换句话来说就是定义自己的colormap(我没这么干,因为调出来的太难看了……)

3. 截取colorbmap中的一部分,制作新的colormap
1,导入模块
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap
import palettable
2,使用matplotlib自带的colormap制作新的colormap
1)获取名为“Blues”的colormap
blues = cm.get_cmap('Blues', 256)
2)获取blues的颜色列表(这个颜色列表为256 * 4的数组,)
newcolors = blues(np.linspace(0, 1, 256))
图片5.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA09E.tmp.jpg
图5 blues颜色列表格式(格式是这样的,值不对,因为是viridis的颜色表)
3)选取“Bluescolorbar的一部分
new = newcolors[256:30:-1]
注意:这里选取就是使用列表切片,可以正向,可以反向,反向就相当于colorbar反转
4)制作成新的colormap
newmap = ListedColormap(new)
5)在contourcontourf中使用cmap关键字
Plt.contourf(LON, LAT, ZETA, level, cmap=newmap, alpha=0.8, zorder=1)
3,使用palettable中的colormap制作新的colormap
deep = ListedColormap(palettable.cmocean.sequential.Deep_20.mpl_colors)
newcolors = deep(np.linspace(0, 1, 256))
new = newcolors[220:0:-1]
newmap = ListedColormap(new)
截取部分colorbar参考网址:
4. 参考matplotlib中的creating a colormap from a list of colors,从头开始制作一个全新的colormap
....................................................................................................................................................
至于怎么做,大家参考网址吧(我没干过……):
最后说一句,最好的教程还是官方文档啊,只不过人家是英文的……








附一张我最后的图(当然是经过处理的……)
图片6.png

注:这个程序是不能直接运行的,因为我没有把数据上传上来,原因………………
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA09F.tmp.jpg


depth.py

4.52 KB, 下载次数: 28, 下载积分: 金钱 -5

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

新浪微博达人勋

发表于 2018-12-11 06:38:17 | 显示全部楼层
拜读了,厉害了,专研的很透彻啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-12-16 11:17:02 | 显示全部楼层
建议看看cmaps模块
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-12-17 10:25:55 | 显示全部楼层

好的,谢谢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-9-27 11:07:37 | 显示全部楼层
借鉴了第二种方法,感谢感谢~
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-10-28 08:51:27 | 显示全部楼层
怎么设置尖状色标呢{:eb302:}{:eb302:}{:eb302:}{:eb302:}{:eb302:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-10-28 09:48:07 | 显示全部楼层
Alexander 发表于 2019-10-28 08:51
怎么设置尖状色标呢

Plt.contourf(LON, LAT, ZETA, level, cmap=newmap, alpha=0.8, zorder=1),在画图语句加extend='both',如下:
Plt.contourf(LON, LAT, ZETA, level, cmap=newmap,extend='both', alpha=0.8, zorder=1)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-11-10 15:49:41 | 显示全部楼层
请问前辈知道如何设置colorbar的标签位置吗 设定到标签正右方
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-11-17 12:38:37 | 显示全部楼层
非常受益,谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-4 21:30:05 | 显示全部楼层
Alexander 发表于 2019-10-28 08:51
怎么设置尖状色标呢

画图的时候这样  
fig4= ax4.contourf(lon,lat, pstd[0,:,:],extend='both',zorder=0, transform=ccrs.PlateCarree(), cmap=cmaps.matlab_jet)

其中的 extend='both' 就是尖状色标的设置
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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