代码之家  ›  专栏  ›  技术社区  ›  jb16006

Matplotlib:使用spstere投影关注特定的lon/lat

  •  3
  • jb16006  · 技术社区  · 7 年前

    我试图使用Python中matplotlib包中的“spstere”投影将我的地图集中在南极洲的一个特定区域。我能画出整个南极洲,但这次我想放大,仔细看看该大陆的一个特定区域。

    Pyplot contour plot - clabel spacing ; http://matplotlib.org/basemap/api/basemap_api.html ; https://matplotlib.org/basemap/users/examples.html )可以在网上找到,但我无法将这些应用于南极的“spstere”投影。

    我基本上想把我的地图集中在南极半岛的地区,它大致从

    llcrnrlon=-100,urcrnrlon=-30,llcrnrlat=-90,urcrnrlat=-55.0

    我曾尝试将此代码用于“spstere”项目,但python只考虑了boundinglat和lon\u 0。我曾尝试更改boundinglat和lon\u 0的值,但它也不起作用。

    m = Basemap(projection='cyl',lon_0=0,lat_0=0,\
          llcrnrlon=-180,urcrnrlon=180,llcrnrlat=-90,urcrnrlat=-55.0,resolution='c')
    

    任何帮助都将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  4
  •   ImportanceOfBeingErnest    7 年前

    使用极赤平投影 'spstere' ,您可以使用例如。 boundinglat=-60

    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    
    m = Basemap(projection='spstere',boundinglat=-60,lon_0=180,resolution='c')
    m.drawcoastlines()
    
    plt.show()
    

    enter image description here

    请注意 “spstere”
    为了绘制一张不以南极为中心的地图,您需要使用 "stere" 预测设置 “斯特尔”

    因此,可以在中使用绘图

    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    import numpy as np
    
    m = Basemap(projection='spstere',boundinglat=-50,
                lon_0=180+(-100+-30)/2.,resolution='c')
    
    m.drawmeridians(np.arange(0,360,30),labels=[1,1,1,0])
    m.drawparallels(np.arange(-90,90,5))
    m.drawcoastlines()
    
    xll, yll = m(-150,-70) # <-- find those points by looking at meridians and parallels
    xur, yur = m(-30,-55)
    m.scatter([xll,xur], [yll, yur], c="crimson")
    plt.show()
    

    enter image description here

    使用这些点, (-150,-70, -30,-55) 'stere' 预测

    m = Basemap(projection='stere',resolution='c',
                lat_0=-90, lon_0=(-100+-30)/2.,  lat_ts=(-90.+-55.)/2.,
                llcrnrlon=-150,urcrnrlon=-30,llcrnrlat=-70,urcrnrlat=-55)
    

    enter image description here

    如果不需要这种启发式方法,您可以通过在中创建虚拟映射来自动执行此过程 “spstere” 投影,从有问题的矩形计算坐标( llcrnrlon=-100,urcrnrlon=-30,llcrnrlat=-90,urcrnrlat=-55.0 )并在中创建新的底图 stere 投影。下面的函数取自 ActiveState site

    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    import numpy as np
    
    def polar_stere(lon_w, lon_e, lat_s, lat_n, **kwargs):
        '''Returns a Basemap object (NPS/SPS) focused in a region.
        lon_w, lon_e, lat_s, lat_n -- Graphic limits in geographical coordinates.
                                      W and S directions are negative.
        **kwargs -- Aditional arguments for Basemap object.
        '''
        lon_0 = lon_w + (lon_e - lon_w) / 2.
        ref = lat_s if abs(lat_s) > abs(lat_n) else lat_n
        lat_0 = np.copysign(90., ref)
        proj = 'npstere' if lat_0 > 0 else 'spstere'
        prj = Basemap(projection=proj, lon_0=lon_0, lat_0=lat_0,
                              boundinglat=0, resolution='c')
        lons = [lon_w, lon_e, lon_w, lon_e, lon_0, lon_0]
        lats = [lat_s, lat_s, lat_n, lat_n, lat_s, lat_n]
        x, y = prj(lons, lats)
        ll_lon, ll_lat = prj(min(x), min(y), inverse=True)
        ur_lon, ur_lat = prj(max(x), max(y), inverse=True)
        return Basemap(projection='stere', lat_0=lat_0, lon_0=lon_0,
                               llcrnrlon=ll_lon, llcrnrlat=ll_lat,
                               urcrnrlon=ur_lon, urcrnrlat=ur_lat, **kwargs)
    
    llcrnrlon=-100
    urcrnrlon=-30
    llcrnrlat=-90
    urcrnrlat=-55.0
    m = polar_stere(llcrnrlon, urcrnrlon, llcrnrlat, urcrnrlat)
    
    m.drawmeridians(np.arange(0,360,30),labels=[1,1,1,0])
    m.drawparallels(np.arange(-90,90,30),labels=[1,1,1,1])
    m.drawcoastlines()
    
    plt.show()
    

    enter image description here