basemap
активно не разрабатывается, но обслуживание все еще продолжается некоторое время.Это означает, что вещи, которые ломаются из-за изменений в других пакетах, все еще будут исправлены, но новые функции не будут добавлены.В любом случае, исправление может занять некоторое время, и я предполагаю, что от этого страдает функция xoffset
для параллелей и меридианов.Однако, глядя на документацию basemap
, функциональные возможности xoffset
и yoffset
описываются как
xoffset: смещение метки от края карты в направлении x (по умолчанию - 0,01 от шириныкарты в координатах проекции карты).
yoffset: смещение метки от края карты в направлении y (по умолчанию 0,01-кратная высота карты в координатах проекции карты).
Этодостаточно просто подражать, манипулируя объектами Text
, которые производят drawparallels()
и drawmeridians()
.Результаты этих функций хранятся в dict
, который содержит кортеж списков для каждого построенного параллельного / меридиана, второй из которых содержит текстовые метки.Объект Text
имеет метод get_position()
и set_position()
, который в сочетании с пределами осей и приведенным выше определением может использоваться для вычисления смещения:
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(121)
ax.set_title('Default')
# miller projection
map = Basemap(projection='mill',lon_0=180)
# plot coastlines, draw label meridians and parallels.
map.drawcoastlines()
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1])
ax = fig.add_subplot(122)
ax.set_title('Add offset')
# miller projection
map = Basemap(projection='mill',lon_0=180)
# plot coastlines, draw label meridians and parallels.
map.drawcoastlines()
##getting axes dimensions
x0,x1 = ax.get_xlim()
w = x1-x0
y0,y1 = ax.get_ylim()
h = y1-y0
xoffset = 0.05
yoffset = 0.05
result = map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
##
for key, (lines,texts) in result.items():
for text in texts:
x,y = text.get_position()
text.set_position((x0-xoffset*w,y))
result = map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1])
for key, (lines,texts) in result.items():
for text in texts:
x,y = text.get_position()
text.set_position((x,y0-yoffset*h))
plt.show()
Полученный графиквыглядит так: