【问题标题】:what's wrong with basemap projection="cyl"?底图投影 =“cyl”有什么问题?
【发布时间】:2018-06-23 18:43:37
【问题描述】:

最近几天,我使用 Basemap 可视化了我的 ncep 再分析数据。发现使用Basemap(projection="cyl",lon_0=0.0,lat_0=0.0, resolution="c")时只出现了一半数据,但是使用Basemap(projection="cyl"时出现了全部数据,lon_0=180.0,lat_0=0.0, 分辨率="c") 。此外,我更改了投影,但仍将中心经度设置为 0 度,如 Basemap(projection="hammer",lon_0=0.0,lat_0=0.0, resolution="c"),但整个数据。整个数据出现。发生什么了 ?非常感谢您的回答。

【问题讨论】:

    标签: python projection matplotlib-basemap


    【解决方案1】:

    这是basemap 的常见问题。即使数据应该在纵向上循环,basemap 也无法正确处理。我通常使用cdo 首先以应使用的显示方式对数据进行排序

    cdo sellonlatbox,-180,180,-90,90 input.nc output.nc
    

    cdo 还提供了python wrapper,因此您可以直接在脚本中使用它。如果你不想使用cdo,你可以使用numpy重新排列你的数据,这里是一个小例子:

    from matplotlib import pyplot as plt
    import numpy as np
    from mpl_toolkits import basemap
    
    fig,axes = plt.subplots(nrows=3, ncols=1)
    
    mp1 = basemap.Basemap(ax = axes[0], projection = 'cyl', lon_0=180, lat_0=0)
    mp2 = basemap.Basemap(ax = axes[1], projection = 'cyl', lon_0=0,   lat_0=0)
    mp3 = basemap.Basemap(ax = axes[2], projection = 'cyl', lon_0=0,   lat_0=0)
    
    for mp in mp1, mp2, mp3:
        mp.drawcoastlines()
        mp.drawcountries()
        mp.drawmeridians(np.arange(0,360,30))
        mp.drawparallels(np.arange(-90,90,30))
    
    
    ##some data:
    lons = np.arange(0,360)
    lats = np.arange(-90,91)
    lons,lats = np.meshgrid(lons,lats)
    data = np.sin(2*np.pi*lons/360)+np.sin(np.pi*lats/180)
    
    ##first plot
    mp1.pcolormesh(lons,lats,data)
    
    ##second plot
    mp2.pcolormesh(lons,lats,data)
    
    ##third plot (with longitudes re-ordered)
    lons = lons%180-180*(lons//180) ##re-computing lons to be from -180 to 180
    
    lon_order = np.argsort(lons, axis = 1) ##computing new order of lons
    lat_order = np.argsort(lats, axis = 0) ## ... and lats (maybe unnecessary)
    
    mp3.pcolormesh(lons[lat_order,lon_order],lats, data[lat_order,lon_order])
    
    plt.show()
    

    结果如下所示,第一个图以原始格式显示数据,第二个图尝试将数据集中在 lon_0=0 上而不重新排序,第三个图重新排序。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      在某些情况下,数据集中的经度范围是从 0 到 360,而底图的预期范围是 - 180 到 180。可以使用底图 shiftgrid 函数来处理这个问题。

      from mpl_toolkits.basemap import Basemap

      data, lon = shiftgrid(180., data, lon, start=False) # shiftgrid

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        相关资源
        最近更新 更多