Как установить смещение базовой карты в Python?

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

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 добавлены.

пример

0 ответов

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

Получившийся сюжет выглядит так:

Я думаю, вы используете неправильный блок. @Thomas Kühn процитировал документ базовой карты:

xoffset: смещение надписи от края карты по оси x (по умолчанию 0,01 ширины карты в координатах проекции карты).

yoffset: смещение надписи от края карты в направлении y (по умолчанию 0,01 высоты карты в координатах проекции карты).

Обратите внимание, что по умолчанию он равен 1% от диапазона измерения, измеренного в координатах проекции карты.

Если вы проверите размах по оси Y используемого вами выступа фрезы, длина будет иметь 8 цифр, так что неудивительно. yoffset=100 не дает визуального смещения.

Таким образом, более простой способ - изменить смещение, используя фактический диапазон домена, например:

map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.01*abs(map.ymax-map.ymin))

Это дает то же смещение, что и по умолчанию, то есть 1% диапазона домена (см. Рисунок (b) ниже). Изменение0.01 к 0.03 будет в 3 раза больше (рисунок (c)).

Если вы вместо этого используете cyl проекция, которая использует градусы широты / долготы в качестве единиц, смещения также измеряются в градусах, затем yoffset=100будет безумный зачет. На рисунке (f) используетсяyoffset=30Обратите внимание, что это такое же расстояние, как и расстояние от 60S до 90S.

Скрипт для генерации фигуры:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
fig = plt.figure(figsize=(12,6))

def drawMap(proj):
    map = Basemap(projection=proj,lon_0=180)
    map.drawcoastlines()
    return map

# miller projection
ax = fig.add_subplot(231)
ax.set_title('(a) Mill, Default')
map=drawMap('mill')
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(232)
ax.set_title('(b) Mill, add same offset as default')
map=drawMap('mill')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.01*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.01*abs(map.ymax-map.ymin))

ax = fig.add_subplot(233)
ax.set_title('(c) Mill, add 3x offset as default')
map=drawMap('mill')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.03*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.03*abs(map.ymax-map.ymin))

ax = fig.add_subplot(234)
ax.set_title('(d) Cyl, Default')
map=drawMap('cyl')
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(235)
ax.set_title('(e) Cyl, add same offset as default')
map=drawMap('cyl')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.01*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.01*abs(map.ymax-map.ymin))

ax = fig.add_subplot(236)
ax.set_title('(f) Cyl, add 30 degree offset')
map=drawMap('cyl')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.03*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=30)

fig.subplots_adjust(hspace=0.01)
fig.show()
Другие вопросы по тегам