- 积分
- 25796
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2017-9-4
- 最后登录
- 1970-1-1
|
发表于 2024-11-4 15:24:53
|
显示全部楼层
提供一个不用修改 matplotlib 源码的函数版:
- def custom_barbs(ax, *args, **kwargs):
- '''修改后的 Axes.barbs,使小于 half 的风速显示风杆而非圆圈。'''
- from matplotlib.path import Path
- from matplotlib.quiver import Barbs
- out_list = []
- def decorator(method):
- def wrapper(self, *args, **kwargs):
- mag = args[0]
- n_flags, n_barb, half_flag, empty_flag = method(self, *args, **kwargs)
- small_flag = empty_flag & (mag > 0)
- out_list.append(small_flag)
- empty_flag = mag == 0
- half_flag[small_flag] = True
- return n_flags, n_barb, half_flag, empty_flag
- return wrapper
- try:
- method = Barbs._find_tails
- Barbs._find_tails = decorator(method)
- barbs = ax.barbs(*args, **kwargs)
- finally:
- Barbs._find_tails = method
- small_flag = out_list[0]
- for i in np.nonzero(small_flag)[0]:
- verts = barbs._paths[i].vertices[:2]
- verts = np.vstack((verts, verts[0]))
- barbs._paths[i] = Path(verts)
- return barbs
复制代码 这样一来就能在一张图里同时实现带圆圈和不带圆圈的效果:
- axes[0].barbs(lon, lat, u10, v10, regrid_shape=8, transform=crs)
- custom_barbs(axes[1], lon, lat, u10, v10, regrid_shape=8, transform=crs)
复制代码
不过这个做法仅在 matplotlib 3.9 里测试过,更低的版本不确定能不能行。
无圆圈风向杆.ipynb
(130.9 KB, 下载次数: 0)
|
|