Использование imshow с базовой картой: несоответствие цветов и границ карты

Я пытаюсь построить некоторые данные grib, используя basemap и imshow вместо contourf. Когда я рисую его с помощью contourf, я получаю правильные границы и цвета, но когда я делаю это с помощью imshow, возникает несоответствие между изображением и картой. Постройте с контуром используя contourf. Постройте с помощью imshow используя imwshow

Я использую проекцию lcc. В документации я вижу несколько примеров с использованием цилиндрической проекции, но я также вижу несоответствие в этом случае. Соответствующий код ниже.

m = Basemap(llcrnrlon=-55, llcrnrlat=55.8, urcrnrlon=80, urcrnrlat=80, lat_1=72, lat_0=72., lon_0=-36, resolution='h', projection='lcc')
x, y = m(lons, lats)

data = data - 273.15
import matplotlib as mpl
cmap = mpl.cm.RdBu_r
norm = mpl.colors.Normalize(vmin=-55, vmax=15)
minVal = min(data.flatten())
maxVal = max(data.flatten())
clev = np.arange(minVal,maxVal,0.01)
#using contourf
CS_tmp = m.contourf(x,y,data,clev,cmap=plt.cm.coolwarm)
#using imshow
CS_tmp = m.imshow(data2,cmap=cmap) #,extent=extent)

У меня вопрос: какое преобразование следует применить к данным? Я пытался следовать этому руководству https://basemaptutorial.readthedocs.io/en/latest/utilities.html#interp, который ссылается на transform_scalar, который работает только для цилиндрических проекций.

Предлагается использовать интерполяцию для проекции без цилиндра. обычный. Смотрите промежуточный пример для решения.

Я пробовал следовать приведенному здесь примеру, но это не сработало, и я все еще вижу несоответствие

x2 = np.linspace(x[0][0],x[0][-1],x.shape[1]*2)
y2 = np.linspace(y[0][0],y[-1][0],y.shape[0]*2)
x2, y2 = np.meshgrid(x2, y2)
data_trans = interp(data,  x[0], y[:, 0], x2, y2,order=1)

Может ли кто-нибудь сказать мне, какая бы здесь адекватная трансформация?

Спасибо за любую помощь

Карлос


person Carlos Peralta    schedule 19.09.2020    source источник
comment
Что такое data и data2, как они связаны? Если вы сможете опубликовать исполняемый код, вам будет легче найти проблему.   -  person swatchai    schedule 22.09.2020


Ответы (1)


Я думаю, проблема в том, что график imshow вписывается во все окно рисунка на вашем графике, потому что matplotlib не может получить какую-либо информацию о координатах из вашего массива.

Если бы вы использовали другую проекцию, можно было бы правильно установить границы, но поскольку вы используете полярную проекцию, экстент координат достигает 80 ° по широте и долготе.

Итак, вам нужно добавить nan в ваш массив data2.

Код может выглядеть так:

# take a raw array of zeros along longitude axes 
base_nan_array = np.zeros(len(x))

# find out how many rows must be added
n_lat_rows =len(y) - data2.shape[1]

# fill up nan array 
nan_array = np.array([base_nan_array,]*n_lat_rows)

# append to data (you have to find the direction of append on your own bc. no test data is avail.)
np.append([data2, nan_array], axis=0)

Это заставит ваш массив покрыть всю вашу базовую карту.

person dl.meteo    schedule 16.10.2020