爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
12
返回列表 发新帖

[求助] python绘制风场风羽图时2m/s以下的如何显示风杆而不是圆圈?

[复制链接]

新浪微博达人勋

 楼主| 发表于 2024-11-4 12:55:58 | 显示全部楼层

谢谢,成功解决啦!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-11-4 15:24:53 | 显示全部楼层
提供一个不用修改 matplotlib 源码的函数版:
  1. def custom_barbs(ax, *args, **kwargs):
  2.     '''修改后的 Axes.barbs,使小于 half 的风速显示风杆而非圆圈。'''
  3.     from matplotlib.path import Path
  4.     from matplotlib.quiver import Barbs

  5.     out_list = []

  6.     def decorator(method):
  7.         def wrapper(self, *args, **kwargs):
  8.             mag = args[0]
  9.             n_flags, n_barb, half_flag, empty_flag = method(self, *args, **kwargs)
  10.             small_flag = empty_flag & (mag > 0)
  11.             out_list.append(small_flag)
  12.             empty_flag = mag == 0
  13.             half_flag[small_flag] = True
  14.             return n_flags, n_barb, half_flag, empty_flag

  15.         return wrapper

  16.     try:
  17.         method = Barbs._find_tails
  18.         Barbs._find_tails = decorator(method)
  19.         barbs = ax.barbs(*args, **kwargs)
  20.     finally:
  21.         Barbs._find_tails = method

  22.     small_flag = out_list[0]
  23.     for i in np.nonzero(small_flag)[0]:
  24.         verts = barbs._paths[i].vertices[:2]
  25.         verts = np.vstack((verts, verts[0]))
  26.         barbs._paths[i] = Path(verts)

  27.     return barbs
复制代码
这样一来就能在一张图里同时实现带圆圈和不带圆圈的效果:
  1. axes[0].barbs(lon, lat, u10, v10, regrid_shape=8, transform=crs)
  2. custom_barbs(axes[1], lon, lat, u10, v10, regrid_shape=8, transform=crs)
复制代码
test.png
不过这个做法仅在 matplotlib 3.9 里测试过,更低的版本不确定能不能行。
无圆圈风向杆.ipynb (130.9 KB, 下载次数: 0)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-11-4 16:15:37 | 显示全部楼层
灭火器 发表于 2024-11-4 15:24
提供一个不用修改 matplotlib 源码的函数版:
这样一来就能在一张图里同时实现带圆圈和不带圆圈的效果:
...

好的我去试试,谢谢!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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