Проблема с аргументом drawparallels в базовой карте - PullRequest
0 голосов
/ 16 мая 2018

Кажется, это должно быть легко исправить, но я не могу заставить его работать. Я бы хотел, чтобы 40 ° северной широты отображалось на прикрепленном графике, но установка аргумента меток в drawparallels на [1,0,1,1] не помогает. Это должно составить метки параллелей, где они пересекают левую, верхнюю и нижнюю части графика в соответствии с документацией. Я также хотел бы, чтобы 0 ° снова появился в правом нижнем углу. Любая идея, как я могу исправить эти 2 проблемы?

from netCDF4 import Dataset as NetCDFFile
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
from mpl_toolkits.basemap import addcyclic
nc = NetCDFFile('C:/myfile.nc')
lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time = nc.variables['time'][:]
olr = nc.variables['olr'][:]
olr,lon = addcyclic(olr,lon)
map = Basemap(llcrnrlon=0.,llcrnrlat=-40.,urcrnrlon=360.,urcrnrlat=40.,resolution='l')
lons,lats = np.meshgrid(lon,lat)
x,y = map(lons,lats)
levels = np.arange(-19.5,20.0,0.5)
levels = levels[levels!=0]
ticks = np.arange(-20.0,20.0,4.0)
cs = map.contourf(x,y,olr[0],levels, cmap='bwr')
cbar = plt.colorbar(cs, orientation='horizontal', cmap='bwr', spacing='proportional', ticks=ticks)
cbar.set_label('Outgoing Longwave Radiation Anomalies $\mathregular{(W/m^2)}$')
map.drawcoastlines()
map.drawparallels(np.arange(-40,40,20),labels=[1,0,1,1], linewidth=0.5, fontsize=7)
map.drawmeridians(np.arange(0,360,40),labels=[1,1,0,1], linewidth=0.5, fontsize=7)

Plot showing issues with labels

1 Ответ

0 голосов
/ 16 мая 2018

Первая часть вопроса проста.Чтобы метка появилась, вы должны провести параллель, но np.arange(-40,40,20) не включает 40.Таким образом, если вы измените это утверждение на np.arange(-40,41,20), появится ваша метка 40N.

Вторая часть в принципе должна быть разрешимой таким же образом, но в Basemap, очевидно, используется модуль долгот для вычисленияположение меток, поэтому просто используя np.arange(0,361,40) при рисовании меридианов, вы получите две 0 метки друг над другом.Однако мы можем зафиксировать метки, которые генерирует drawmeridians, и вручную изменить положение второй метки 0.Метки хранятся в словаре, поэтому с ними легко иметь дело.Чтобы вычислить позицию x последней метки, я вычисляю разницу в позиции x между первой и второй меткой, умножаю ее на количество меридианов, которые нужно нарисовать (360/40), и добавляю позицию x первойэтикетка.

Вот полный пример:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap

map = Basemap(llcrnrlon=0.,llcrnrlat=-40.,urcrnrlon=360.,urcrnrlat=40.,resolution='l')

map.drawcoastlines()
yticks = map.drawparallels(
    np.arange(-40,41,20),labels=[1,0,1,1], linewidth=0.5, fontsize=7
)
xticks = map.drawmeridians(
    np.arange(0,361,40),labels=[1,1,0,1], linewidth=0.5, fontsize=7
)


first_pos = xticks[0][1][0].get_position()
second_pos = xticks[40][1][0].get_position()
last_x = first_pos[0]+(second_pos[0]-first_pos[0])*360/40
xticks[360][1][0].set_position((last_x,first_pos[1]))

plt.show()

Вот результирующий график:

result of the above code

Надеюсь, это поможет.

...