You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在地图上叠加显示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()只能处理单个坐标值和单个文本内容,你直接传入整个经纬度数组和降雪数据数组,它没法解析,所以触发了这个报错。要实现栅格值文本叠加,得逐个遍历栅格点添加文本:

  1. 先把xarray格式的经纬度、降雪数据转成numpy数组,方便遍历:
lon_arr = lon.values
lat_arr = lat.values
snow_arr = snowdata.values
  1. 嵌套循环遍历栅格点,按需添加文本(建议设置步长避免文本过密):
# 定义坐标参考系,比如经纬度坐标用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:05:21