Добавление меток & xticks/yticks (широта и долгота) на орфографическую карту с помощью cartopy и matplotlib

Я хочу построить ортогональную проекционную карту с линиями сетки. Вот мой код

def subPlotMap_general(Z, lon, lat,figname,save_at,var_stat, sub_title, cb_tick): 
    import matplotlib.plot as plt
    import matplotlib as mpl
    import cartopy.crs as ccrs
    import cartopy
    from matplotlib.ticker import MultipleLocator, FormatStrFormatter
    from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER


    xmajorLocator   = MultipleLocator(2)
    ymajorLocator   = MultipleLocator(2)

    smallest_fotsz = 10

    latmax = 52
    lonmin =-5
    lonmax = 10
    latmin = 41#min(lat)

    img_extent = [lonmin, lonmax, latmin, latmax]

    # Projection system
    data_crs=cartopy.crs.PlateCarree()
    proj=cartopy.crs.PlateCarree()
    #axes_class = (GeoAxes, dict(map_projection=proj))

    data_crs_1 = cartopy.crs.Orthographic(central_longitude=0,
                                        central_latitude=45, globe=None)

    coast = cartopy.feature.NaturalEarthFeature(
            category='physical', scale='50m', 
            name='coastline', facecolor='none', edgecolor='k')

    ocean = cartopy.feature.NaturalEarthFeature(
            category='physical', scale='50m', 
            name='ocean', facecolor='#DDDDDD')

    fig, axes = plt.subplots(nrows=2,ncols=3, #ccrs.PlateCarree()
                             subplot_kw={'projection': cartopy.crs.Orthographic(central_longitude=0,
                                        central_latitude=45, globe=None)})
    fig.set_size_inches(7.25, 6)
    plt.tight_layout(pad = 4, h_pad=0.5, w_pad=2)
    i = 0
    for ax in axes.flat:
        ax.set_extent(img_extent, crs=ccrs.PlateCarree())
        ax.add_feature(coast, lw=0.8, alpha=0.5, zorder=9)
        ax.add_feature(ocean, alpha=0.4,zorder=8)
        cmap = mpl.colors.ListedColormap(["grey","darkgreen","lightgreen", "darkred", "darkblue", "lime", "goldenrod", "olive",'darksalmon', 'yellowgreen', 'skyblue', 'khaki','dimgray'])

        sc = ax.scatter(lon, lat, marker='o', c=Z[var_stat[i]], transform=data_crs, 
                        cmap='YlGnBu',
                        zorder=7,
                       #vmin=0.75,vmax=0.9, 
                        s=5) #zorder decides layer order (1 is bottom)
        ax.set_title(label = '('+chr(97+i)+') '+sub_title[i%3], fontsize = smallest_fotsz, loc = 'center')

        gl = ax.gridlines(crs=data_crs, draw_labels=True,
                          zorder=10,
                          linestyle='--', linewidth=.5, color = 'black')

        gl.xlabels_top = False #no xlabels on top (longitudes)
        gl.ylabels_right = False #no ylabels on right side (latitudes)
        if i != 0 and i != 3:
            gl.ylabels_left = False

        axpos=ax.get_position()
        cbar_ax=fig.add_axes([axpos.x1, axpos.y0+0.1,0.0075, axpos.height/(23/12)]) #l, b, w, h

        cbar=fig.colorbar(sc,cax=cbar_ax)
        cbar.ax.tick_params(labelsize=smallest_fotsz/2)
        if i == 2 or i == 5:
            cbar.set_label(cb_tick[int(i/3)], fontsize = smallest_fotsz)#'Pearson correlation coefficient')

        gl.xlocator = xmajorLocator
        gl.ylocator = ymajorLocator

        gl.xformatter = LONGITUDE_FORMATTER
        gl.yformatter = LATITUDE_FORMATTER
        gl.xlabel_style = {'size': smallest_fotsz, 'color': 'black',
#                           'weight': 'bold',
                           'rotation': 45} #formatting of gridline labels
        gl.ylabel_style = {'size': smallest_fotsz, 
#                           'weight': 'bold',
                           'color': 'black'}

        make_axes_locatable(ax) #divider = 
        i = i+1
    fig.show()

Однако я только что получил это от ide:

Traceback (most recent call last):

  File "<ipython-input-199-8a00015659e5>", line 144, in <module>
    var_stat, sub_title, cb_tick)

  File "<ipython-input-199-8a00015659e5>", line 96, in subPlotMap_general
    linestyle='--', linewidth=.5, color = 'black')

  File "D:\anaconda\lib\site-packages\cartopy\mpl\geoaxes.py", line 1224, in gridlines
    ylocator=ylocs, collection_kwargs=kwargs)

  File "D:\anaconda\lib\site-packages\cartopy\mpl\gridliner.py", line 185, in __init__
    self._assert_can_draw_ticks()

  File "D:\anaconda\lib\site-packages\cartopy\mpl\gridliner.py", line 399, in _assert_can_draw_ticks
    'supported.'.format(prj=self.axes.projection))

TypeError: Cannot label gridlines on a Orthographic plot.  Only PlateCarree and Mercator plots are currently supported.

Я искал в гитхабе и мне сказали, что мне нужно подождать, пока выйдет картопия 0.19.0. Однако эта карта мне очень нужна, так что есть ли кто-нибудь, кто может помочь мне найти альтернативное решение? добавление xtick/ytick (lat lon) другими методами? Большое спасибо!

0 ответов

Другие вопросы по тегам