| 
 
	积分28511贡献 精华在线时间 小时注册时间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
我这里画出来是正常的,就直接画
 
 | 
 |