使用 cartopy 绘制来自 netcdf 文件的 4 维变量的数据
Posted
技术标签:
【中文标题】使用 cartopy 绘制来自 netcdf 文件的 4 维变量的数据【英文标题】:plotting data from a 4-dimensional variable from a netcdf file with cartopy 【发布时间】:2021-05-28 13:46:49 【问题描述】:我想知道如何在地图上绘制带有 cartopy 的 NetCDF 文件的变量“r”(相对湿度)的数据?
enter code here
from netCDF4 import Dataset
import cartopy.crs as ccrs
import numpy as np
import xarray as xr
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ds = Dataset('relative_humidityEne_Dic2003_2020CMAS.nc', 'r')
lon = ds.variables["longitude"]
lat = ds.variables["latitude"]
level = ds.variables["level"]
time = ds.variables["time"]
r = ds.variables["r"]
ax = plt.axes(projection=ccrs.PlateCarree())
r_ds = ds.variables['r'][0, :, :, :]
plt.contourf(lon, lat, r_ds, transform=ccrs.PlateCarree())
ax.coastlines()
plt.show()
root group (NETCDF3_64BIT_OFFSET data model, file format NETCDF3):
Conventions: CF-1.6
history: 2021-02-19 10:03:12 GMT by grib_to_netcdf-2.16.0: /opt/ecmwf/eccodes/bin/grib_to_netcdf -S param -o /cache/data7/adaptor.marsdev.internal-1613728991.1847723-6796-17-440f19fd-bb8f-478f-bc36-959e3e9d9c42.nc /cache/tmp/440f19fd-bb8f-478f-bc36-959e3e9d9c42-adaptor.marsdev.internal-1613728966.210842-6796-20-tmp.grib
dimensions(sizes): longitude(480), latitude(241), level(8), time(53)
variables(dimensions): float32 longitude(longitude), float32 latitude(latitude), int32 level(level), int32 time(time), int16 r(time,level,latitude,longitude)
groups:
dict_keys(['longitude', 'latitude', 'level', 'time', 'r'])
las dimenciones variable r es: ('time', 'level', 'latitude', 'longitude')
(53, 8, 241, 480)
----------------------------------------------------------------------
<class 'netCDF4._netCDF4.Variable'>
int16 r(time, level, latitude, longitude)
scale_factor: 0.001964639476266317
add_offset: 64.43876426873042
_FillValue: -32767
missing_value: -32767
units: %
long_name: Relative humidity
standard_name: relative_humidity
unlimited dimensions:
current shape = (53, 8, 241, 480)
filling on
las dimenciones variable r es: ('time', 'level', 'latitude', 'longitude')
(53, 8, 241, 480)
############################################## ########## 消息错误
Traceback(最近一次调用最后一次): 文件“/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py”,第 3331 行,在 run_code 执行(code_obj,self.user_global_ns,self.user_ns) 文件“”,第 1 行,在 runfile('/home/leo/Documentos/Universidad/Trabajo_de_investigación/PerfilesVerticalesContaminantesAtmosfera/Datos/readNetdcf42003_2020CMAS.py', wdir='/home/leo/Documentos/Universidad/Trabajo_de_investigación/PerfilesVerticalesContaminantesAtmosfera/Datos') 运行文件中的文件“/snap/pycharm-professional/230/plugins/python/helpers/pydev/_pydev_bundle/pydev_umd.py”,第 197 行 pydev_imports.execfile(filename, global_vars, local_vars) # 执行脚本 文件“/snap/pycharm-professional/230/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py”,第 18 行,在 execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) 文件“/home/leo/Documentos/Universidad/Trabajo_de_investigación/PerfilesVerticalesContaminantesAtmosfera/Datos/readNetdcf42003_2020CMAS.py”,第 65 行,在 plt.contourf(lon, lat, r_ds, transform=ccrs.PlateCarree()) 文件“/home/leo/.local/lib/python3.8/site-packages/matplotlib/pyplot.py”,第 2577 行,位于 contourf __ret = gca().contourf( 包装器中的文件“/home/leo/.local/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py”,第 321 行 返回函数(自我,*args,**kwargs) 文件“/home/leo/.local/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py”,第 1586 行,位于 contourf 结果 = matplotlib.axes.Axes.contourf(self, *args, **kwargs) 文件“/home/leo/.local/lib/python3.8/site-packages/matplotlib/init.py”,第 1447 行,在内部 返回 func(ax, *map(sanitize_sequence, args), **kwargs) 文件“/home/leo/.local/lib/python3.8/site-packages/matplotlib/axes/_axes.py”,第 6335 行,位于 contourf 轮廓 = mcontour.QuadContourSet(self, *args, **kwargs) init 中的文件“/home/leo/.local/lib/python3.8/site-packages/matplotlib/contour.py”,第 816 行 kwargs = self._process_args(*args, **kwargs) _process_args 中的文件“/home/leo/.local/lib/python3.8/site-packages/matplotlib/contour.py”,第 1430 行 x, y, z = self._contour_args(args, kwargs) _contour_args 中的文件“/home/leo/.local/lib/python3.8/site-packages/matplotlib/contour.py”,第 1488 行 x, y, z = self._check_xyz(args[:3], kwargs) _check_xyz 中的文件“/home/leo/.local/lib/python3.8/site-packages/matplotlib/contour.py”,第 1514 行 x = np.asarray(x, dtype=np.float64) asarray 中的文件“/usr/local/lib/python3.8/dist-packages/numpy/core/_asarray.py”,第 102 行 返回数组(a,dtype,copy=False,order=order) TypeError: array() 不带参数(1 个给定)
【问题讨论】:
你能修复你的代码突出显示吗?在代码前一行使用三个反引号(```),在最后一行使用三个。 【参考方案1】:你应该可以使用我的 ncplot 包 (https://pypi.org/project/ncplot/) 做到这一点:
from ncplot import view
view('relative_humidityEne_Dic2003_2020CMAS.nc', 'r')
这将创建一个交互式绘图。
【讨论】:
当我使用 (ncplot) 我有几个错误。文件“/usr/local/lib/python3.8/dist-packages/hvplot/converter.py”,第 1067 行,在 call 中引发 ImportError('Datashading is not available') ImportError: Datashading is不可用 好的,这很奇怪。其中一个依赖项应该安装 datashader,但它似乎不再在 pypi 上。但它确实在 conda-forge 上。因此,最近对依赖项的更新肯定有问题。今天下午我会更新pypi版本。现在你应该可以使用pip install datashader
来解决这个问题
文件 "/usr/local/lib/python3.8/dist-packages/holoviews/plotting/bokeh/element.py",第 1359 行,在 _init_glyphs self._update_glyph(renderer, properties, mapping , glyph, source, source.data) 文件“/usr/local/lib/python3.8/dist-packages/holoviews/core/options.py”,第 227 行,在 exit 中引发 AbbreviatedException( etype, value, traceback) holoviews.core.options.AbbreviatedException: AttributeError: 'str' object has no attribute 'dataspecs' 要查看原始回溯,捕获此异常并调用 print_traceback() 方法。
您愿意帮助我编写我正在编写的代码吗?这行代码给了我一个错误。 plt.pcolormesh (ilon, ilat, r_ds, 60, transform = ccrs.PlateCarree ())
----------------------------------------------- ------ # plotear variables en el map r_ds = [ds.variables['r'][:]] lon_ds = [ds.variables['longitude'][:]] lat_ds = [ds.variables['latitude'][:]] ilon, ilat = np.meshgrid(lon_ds, lat_ds) h = plt.pcolormesh(ilon, ilat, r_ds, 60, transform=ccrs.PlateCarree()) ax.coastlines() plt.show()
好的。这似乎是一个依赖破坏事物的问题。你能修改你原来的问题,以便清楚哪条线导致了问题吗?尝试删除与错误无关的任何代码。例如,打印在这里没有真正的目的以上是关于使用 cartopy 绘制来自 netcdf 文件的 4 维变量的数据的主要内容,如果未能解决你的问题,请参考以下文章