- 积分
- 28230
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2017-9-4
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2025-8-11 08:58:03
|
显示全部楼层
本帖最后由 灭火器 于 2025-8-11 09:09 编辑
- from typing import cast
- import frykit.plot as fplt
- import matplotlib.pyplot as plt
- import numpy as np
- from cartopy.mpl.geoaxes import GeoAxes
- from scipy.ndimage import gaussian_filter
- # 读取数据
- data = fplt.load_test_data()
- X, Y = np.meshgrid(data.lon, data.lat)
- t2m = gaussian_filter(data.t2m - 273.15, sigma=1)
- u10 = gaussian_filter(data.u10, sigma=1)
- v10 = gaussian_filter(data.v10, sigma=1)
- # 设置投影
- map_crs = fplt.CN_AZIMUTHAL_EQUIDISTANT
- data_crs = fplt.PLATE_CARREE
- # 准备地图
- fig = plt.figure(figsize=(8, 5))
- main_ax = fig.add_subplot(projection=map_crs)
- mini_ax = fplt.add_mini_axes(main_ax)
- main_ax = cast(GeoAxes, main_ax)
- mini_ax = cast(GeoAxes, mini_ax)
- main_ax.set_extent((74, 136, 13, 57), crs=data_crs)
- mini_ax.set_extent((105, 122, 2, 25), crs=data_crs)
- for ax in [main_ax, mini_ax]:
- fplt.add_cn_province(ax, lw=0.25)
- fplt.add_cn_line(ax)
- # 绘制气温
- for i, ax in enumerate([main_ax, mini_ax]):
- cf = ax.contourf(
- X,
- Y,
- t2m,
- levels=np.linspace(-10, 35, 10),
- cmap="plasma",
- extend="both",
- transform=data_crs,
- transform_first=True,
- )
- fplt.clip_by_cn_border(cf)
- if i == 0:
- fig.colorbar(cf, ax=ax, label="Temperature (℃)")
- # 用 stride 替代 regrid_shape
- stride = 6
- s = np.s_[::stride, ::stride]
- # 绘制风场
- # 用 inches 单位保证大图小图里的箭头大小相同
- quiver_kwargs = dict(
- x=X[s],
- y=Y[s],
- u=u10[s],
- v=v10[s],
- scale=30,
- scale_units="inches",
- units="inches",
- width=0.01,
- headwidth=4,
- transform=data_crs,
- )
- main_Q = main_ax.quiver(**quiver_kwargs)
- mini_Q = mini_ax.quiver(**quiver_kwargs)
- fplt.clip_by_cn_border(main_Q)
- fplt.clip_by_cn_border(mini_Q)
- fplt.add_quiver_legend(main_Q, U=10, height=0.12, loc="lower left")
- fplt.savefig("quiver.png")
- plt.close(fig)
复制代码
- matplotlib==3.10.5
- cartopy==0.25.0
- frykit==0.7.5.post1
复制代码
我这里画出来是正常的,就直接画
|
|