Как установить смещение базовой карты в 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()