Добавление меток & 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) другими методами? Большое спасибо!