爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 1595|回复: 15

[求助] Python | 请问多子图共用一个Colorbar如何设置?

[复制链接]

新浪微博达人勋

发表于 2023-6-26 16:59:29 | 显示全部楼层 |阅读模式
3金钱

假设春夏秋冬四季在图1中分别由(a)(b)(c)(d)表示,.nc文件中变量为风速。
1.首先使用Contourf对四个季节的平均风速进行填色,使用相同的'cmap=mpl.cm.RdBu_r',结果如图1所示。
2.如果四个子图共用一个Colobar,请问Colorbar的来源/映射该如何确定呢?

图1四个季节平均风速填色图.png

最佳答案

查看完整内容

先在绘图时强制地把levels设定为固定的值 4个子图全部一样的levels 然后取最后一个ax作为colorbar的句柄即可
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2023-6-26 16:59:30 | 显示全部楼层
先在绘图时强制地把levels设定为固定的值
4个子图全部一样的levels
然后取最后一个ax作为colorbar的句柄即可
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-26 17:45:25 | 显示全部楼层
同问{:eb315:}{:eb315:}{:eb315:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-26 18:03:07 来自手机 | 显示全部楼层
matplotlib有例子啊
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-26 18:06:14 来自手机 | 显示全部楼层
https://www.matplotlib.org.cn/gallery/subplots_axes_and_figures/subplots_adjust.html
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-26 18:18:02 | 显示全部楼层

您好,感谢回复!子图共用一个Colorbar是会设置的,没弄清楚的地方主要是Colorbar的来源如何选择呢?如果单纯使用某一个季节好像不对?比如使用冬季,那是不是这个总的colorbar只能映射冬季的风速情况呢?
winter= ax4.contourf(lon,lat,spd_winter, cmap=mpl.cm.RdBu_r, transform=ccrs.PlateCarree())
fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.9, 0.15, 0.02, 0.8] )
cb = fig.colorbar(winter, drawedges=True, cax=cbar_ax)
cb.set_label('Average Wind Speed $\mathrm{(m/s)}$')
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-26 18:46:05 | 显示全部楼层
补充一下:
有尝试过使用:
winter_min = np.nanmin(spd_winter)
winter_max = np.nanmax(spd_winter)
levels=np.linspace(winter_min, winter_max, 11)
并使用np.linspace生成等间隔的颜色标记,确保每个季节的填色图使用相同的颜色映射和值范围,但是四个子图填色和值好像还是不能统一,好像这种情况下也没办法共用一个Colorbar?
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-26 21:03:29 | 显示全部楼层
cb = plt.colorbar(cf, ax=[ax1, ax2, ax3, ax4]),这样就可以了
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-26 21:19:52 | 显示全部楼层
本帖最后由 XzzX_y 于 2023-6-26 21:23 编辑
SunJiaming 发表于 2023-6-26 21:03
cb = plt.colorbar(cf, ax=[ax1, ax2, ax3, ax4]),这样就可以了

收到,感谢您的回复!
'cb = plt.colorbar(cf, ax=[ax1, ax2, ax3, ax4])',如果我没理解错的话,应该是为每个子图 ax1, ax2, ax3, ax4 分别创建一个独立的colorbar?这应该不会实现四个子图共用一个colorbar的效果。主要想向您求助的是:如果四个子图共用一个cb,其中cf应该选择哪个季节/或者其他数据作为来源呢?因为每个季节的风速极值不同,导致划分的leves也不同。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-26 21:35:37 | 显示全部楼层
付亚男 发表于 2023-6-26 21:25
先在绘图时强制地把levels设定为固定的值
4个子图全部一样的levels
然后取最后一个ax作为colorbar的句柄 ...

收到!
请问levels一般如何选择呢?
我之前的做法是基于变量的最小值和最大值来确定。
比如春夏秋冬的levels都等于:levels=np.linspace(min, max, 11)
但是有时候会出现一个问题:colormap中存储的颜色数组长度少于levels数组长度,超出的部分就填不上色了。
因为以后不单单只画风速的图,还需要输出对风速进行计算的图片。
请问您levels比较通行的确定方法是什么呢?谢谢,辛苦您了!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

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

本版积分规则

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

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

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