如何在地图上叠加显示NetCDF栅格降雪数据的文本值?
问题描述
我想把降雪数据的NetCDF栅格值以文本形式叠加到已绘制好的地图上,效果参考示例图。目前我已经完成了部分绘图,使用plt.text时出现报错:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(),相关代码如下:
import numpy from datetime import datetime import cartopy.crs as ccrs import cartopy.feature as cfeature import cartopy.mpl.ticker as cticker import matplotlib.pyplot as plt from matplotlib import ticker, patheffects from metpy.units import units import numpy as np import numpy.ma as ma from scipy.ndimage import gaussian_filter, maximum_filter, minimum_filter import xarray as xr from metpy.plots import USCOUNTIES from gradient import Gradient import pandas as pd import matplotlib.colors as col # 打开NOAA降雪数据集 ds = xr.open_dataset('sfav2_CONUS_2021093012_to_2022042512.nc') ds lat = ds.lat lon = ds.lon # 将降雪数据转换为英寸单位 snowdata = ds['Data'] * 39 plt.text(lon, lat, snowdata, transform=datacrs)
问题原因及解决办法
plt.text()只能处理单个坐标值和单个文本内容,你直接传入整个经纬度数组和降雪数据数组,它没法解析,所以触发了这个报错。要实现栅格值文本叠加,得逐个遍历栅格点添加文本:
- 先把xarray格式的经纬度、降雪数据转成numpy数组,方便遍历:
lon_arr = lon.values lat_arr = lat.values snow_arr = snowdata.values
- 嵌套循环遍历栅格点,按需添加文本(建议设置步长避免文本过密):
# 定义坐标参考系,比如经纬度坐标用PlateCarree datacrs = ccrs.PlateCarree() # 设置步长,每5个栅格点取一个,避免文本扎堆 step = 5 for i in range(0, lon_arr.shape[0], step): for j in range(0, lat_arr.shape[0], step): # 跳过掩码缺省值 if ma.is_masked(snow_arr[i, j]): continue # 格式化文本显示,保留1位小数 plt.text(lon_arr[i, j], lat_arr[i, j], f'{snow_arr[i, j]:.1f}', transform=datacrs, fontsize=8, color='black', # 可选:加白色描边,让彩色底图上的文本更清晰 path_effects=[patheffects.withStroke(linewidth=1, foreground='white')])
注意:
- 步长可以根据你的栅格分辨率调整,分辨率高就调大步长,避免文本覆盖地图
- 必须提前定义
datacrs,否则transform参数会报错
内容的提问来源于stack exchange,提问作者WxEnthusiast
相关产品推荐
相关产品推荐

