首页 > 解决方案 > 在 Python 中绘制 2 级 NEXRAD 雷达数据 - TypeError:“MaskedArray”对象不可调用

问题描述

你好 StackOverflow 社区,

我是一名新手 Python 程序员(Python 3.8.1),他正在寻找一些帮助来绘制我从 NOAA 天气和气候工具包(我相信是网格化 NetCDF3 文件)导出的 NEXRAD 2 级雷达图像,并放在我拥有的底图之上使用底图 1.2.1 创建。我正在终端窗口(Mac OS Mojave 10.14.6)上通过 miniconda 使用 Jupyter Notebooks 运行我的代码。

这是我的代码的第一部分,它定义了底图并成功地将其与海岸线和纬度/经度线一起绘制(请注意,底图声明的坐标将地块绑定到南加州)。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

def data_map():
    plt.clf()
    fig = plt.figure(figsize = (10,10))
#----------------------------------------------------------------------------------------------
    #Set lat/lon coordinates for basemap projection (default projection = cylindrical equadistant)
    lllon = -121
    lllat = 32
    urlon = -115.5
    urlat = 35.5

    #set lat/lon coordinates as well as plotting interval for drawing lat/lon as axis of plot
    latmin=32
    latmax=36
    lonmin=-121
    lonmax=-114
    latinterval=1
    loninterval=1
#----------------------------------------------------------------------------------------------
    #create basemap and add some content to create a good starting point for plotting data
    map = Basemap(llcrnrlon=lllon, llcrnrlat=lllat, urcrnrlon=urlon, urcrnrlat=urlat, resolution='f',epsg=3311)
    map.drawcoastlines(linewidth=2,zorder=1)
    map.drawparallels(np.arange(latmin, latmax, latinterval), labels=[1,0,0,0],color='w',textcolor='k',linewidth = 0, zorder=1, fontsize=14)
    map.drawmeridians(np.arange(lonmin, lonmax, loninterval), labels=[0,0,0,1],color='w',textcolor='k',linewidth = 0, zorder=1, fontsize=14)
    map.arcgisimage(service='ESRI_Imagery_World_2D', xpixels=1000)

现在这是我的代码的第二部分,它旨在读取我从 NOAA 天气和气候工具包导出的网格化 NetCDF3 NEXRAD 文件(注意:文件只有一个时间步长)。代码在任何绘图发生之前停止。

import netCDF4 as nc4
#-----------------------------------------------------------------------------------
#NEXRAD lvl 2 plotting using NetCDF file
#Read in NetCDF file variables: lat, lon, time, reflect. 
nc_file = nc4.Dataset('/Users/mariandob/Desktop/my-notebook/KNKX_V03_20120325_232219.nc', format='NETCDF3_CLASSIC')
nc_lat  = nc_file.variables['lat'][:]
nc_lon  = nc_file.variables['lon'][:]
nc_time = nc_file.variables['time'][:]
nc_reflect = nc_file.variables['Reflectivity'][:] 

lon,lat = np.meshgrid(nc_lon,nc_lat) #Unsure if this is necessary. 
#I believe each variable is 1-dimensional
#so I think doing this makes the lat/lon variables into 2-dimensional arrays 
#which is necessary for plotting.

x,y = map(lon,lat) #ERROR OCCURS HERE: TypeError: 'MaskedArray' object is not callable

我在这里找到了一篇关于使用 python 绘制 NetCDF 文件的精彩博客文章。该帖子的作者使用发生错误的行来将 NetCDF 文件的纬度/经度坐标与底图投影中的坐标相匹配。但是,当我尝试这样做时,我得到了错误"TypeError: 'MaskedArray' object is not callable"。我尝试通过用“0”填充掩码值将掩码数组转换为 numpy.ndarray,但似乎 numpy 数组也是不可调用的。我也不确定用“0”填充这些掩码值是否是一个好主意,但是我想测试一下是否可以生成输出图(我做不到)。

有人知道我可能做错了什么吗?此外,一旦找到解决此错误的方法,任何人都可以提供有关哪些命令(pcolor、pcolormesh、fcontour?)可以让我绘制图像的见解。从我在互联网上收集到的信息来看,这个问题似乎与 NEXRAD NetCDF 文件本身有关,而不是下面发布的代码。

感谢任何链接、知识和/或其他帮助。如果这篇文章提供了太多和/或不相关的细节,我深表歉意。

标签: pythonarraysmatplotlibnetcdf

解决方案


你有一个命名空间冲突。map是一个 Python 标准函数,它接受两个函数并将一个函数的输出运行到另一个函数的输入中,从而将它们粘合在一起。

您已重用map作为变量名。更改您的变量名称。


推荐阅读