Как установить смещение базовой карты в Python? - PullRequest
0 голосов
/ 24 ноября 2018

Вот один из примеров базовой карты:

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()
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],xoffset=100,yoffset=100)
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],xoffset=100,yoffset=100)

Я хочу добавить больше пространства между xlabel / ylabel и осью.Но при добавлении xoffset и yoffset пространство становится меньше.

example

1 Ответ

0 голосов
/ 12 декабря 2018

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()

Полученный графиквыглядит так:

Result of the above code

...