【问题标题】:Weird plot for netCDF data with matplotlib使用 matplotlib 绘制 netCDF 数据的奇怪图
【发布时间】:2014-08-13 09:46:09
【问题描述】:

我一直在为此苦苦寻找很长一段时间,所以如果我能得到任何帮助或提示,我将不胜感激。

我正在尝试在南极海域绘制一些海冰干舷数据(netCDF,网格化总干舷),但应该在南极洲周围很好地绘制的数据位于我的图像底部。 NetCDF 和 matplotlib 对我来说相当新,所以错误可能是例如处理尺寸或投影。

from scipy.io.netcdf import netcdf_file as Dataset
import numpy as np
import matplotlib.pyplot as plt

FB = Dataset('./datasets/fb-0217-0320.nc', 'r')
f = FB.variables['f'][:,:]
lat = FB.variables['lat'][:,0]
lon = FB.variables['lon'][0,:]
masked_fb = np.ma.masked_where(np.isnan(f), f)
mtx_lon, mtx_lat = np.meshgrid(lon, lat)
m = Basemap(projection='spstere',boundinglat=-50, lon_0=180., resolution='l')
m.bluemarble()

plt.figure()
m.pcolormesh(mtx_lon, mtx_lat, masked_fb, latlon=True)
plt.show()

ncdump 给出:

dimensions:
x = 79 ;
y = 83 ;
variables:
float lat(y, x) ;
    lat:standard_name = "latitude" ;
    lat:long_name = "latitude coordinate" ;
    lat:units = "degrees_north" ;
float lon(y, x) ;
    lon:standard_name = "longitude" ;
    lon:long_name = "longitude coordinate" ;
    lon:units = "degrees_east" ;
float f(y, x) ;
    f:long_name = "total_freeboard" ;
    f:units = "mm" ;
    f:coordinates = "lat lon" ;

我注意到一个奇怪的事情是 min lat 是 -5156.6201 但我不知道如何计算其中有多少......

编辑:按照 Neil 建议的方式格式化代码以适应通用方式。

【问题讨论】:

    标签: python matplotlib netcdf


    【解决方案1】:

    好的,我从 matplotlib 获得了帮助,我想如果其他人有时遇到类似问题,我应该在这里分享这个。问题出在网格网格上。由于 netCDF 文件中的纬度和经度已经是二维的,因此不需要网格。对我有用的解决方案是:

    from scipy.io.netcdf import netcdf_file as Dataset
    import numpy as np
    import matplotlib.pyplot as plt
    
    FB = Dataset('./datasets/fb-0217-0320.nc', 'r')
    f = FB.variables['f'][:,:]
    lat = FB.variables['lat'][:,:]
    lon = FB.variables['lon'][:,:]
    masked_fb = np.ma.masked_where(np.isnan(f), f)
    m = Basemap(projection='spstere',boundinglat=-50, lon_0=180., resolution='l')
    m.bluemarble()
    
    plt.figure()
    m.pcolormesh(lon, lat, masked_fb, latlon=True)
    plt.show()
    

    【讨论】:

      【解决方案2】:

      首先,通常的做法是在 netcdf 模块中读取为

      from scipy.io.netcdf import netcdf_file as Dataset
      

      然后您可以读取文件并访问变量

      FB = Dataset('./datasets/fb-0217-0320.nc', 'r')
      f = FB.variables['f'][:,:]
      lat = FB.variables['lat'][:,:]
      lon = FB.variables['lon'][:,:]
      

      您确定lat[:,0]lon[0,:] 正确读取网格坐标吗? ncdump 表示它们是二维变量,我怀疑问题是从lat[:,0]lon[0,:] 创建meshgrid

      【讨论】:

      • 感谢您指出阅读该模块的常用方法,尤其是对于初学者来说,以常用的方式阅读总是更好。不,我完全不确定坐标读数,但这是我能够绘制任何东西的唯一方法。我想我必须更深入地研究一下。
      • 尼尔我认为你怀疑网格是错误的原因是正确的。在跟踪形状时,如果我读取 lon[:](或 lon[:,:]),则形状为(83,79),但 lon[:,0] 为(79,),masked_fb 也是(83,79)。但是 meshgrid 将 mtx_lon 变成 (6557,6557) ,这会导致另一个错误。当我处理像 lon[0,:] 这样的坐标时,meshgrid 产生了像 (83,79) 这样的 mtx_lon。
      • 看来您确实需要保留latlon 的二维结构。不幸的是,matplotlib 在这方面遇到了困难,我诚实的建议是使用像 NCL (ncl.ucar.edu/index.shtml) 这样的程序,它比 matplotlib 更好地处理 netCDF 文件(和 2D 网格)。查看该链接,有许多明确的示例说明如何按照您的意愿进行绘图,例如ncl.ucar.edu/Applications/polar.shtml
      • 我从未听说过 NCL,但它看起来非常有用!不幸的是,这是一个打算用 Python 完成的任务。我找到了一个叫做 PyNGL 的东西,它是 NCL 图形库的 Python 接口,看起来很方便,但我不确定我们是否可以使用它……无论如何,谢谢你的 NCL 提示!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 2019-03-24
      • 2022-01-27
      • 1970-01-01
      相关资源
      最近更新 更多