2016-10-12 2 views
1

У меня есть данные спутниковой развертки, которые я пытаюсь построить на базовой карте с помощью pcolormesh.Использование python Basemap.pcolormesh с немонотонными прыжками долготы

Данные организованы как 2d-матрица (bTemp) с двумя соответствующими 2D-массивами lat и lon, которые дают соответствующую широту и долготу в каждой точке. Таким образом, мой код построения выглядит как

m = Basemap() 
m.drawcoastlines() 
m.pcolormesh(lon, lat, bTemp) 

Однако это не совсем дает мне результат, который я ищу. Большая карта проходит по карте. enter image description here

Я думаю, что причиной этого является то, что моя долгота увеличивается немонотонно вдоль данного луча в точке обертывания.

Вот сюжет на луче в моей долготе массиве

plot(lon[100,:]) 

enter image description here

Что бы лучший способ исправить это будет, так что pcolormesh сюжет просто переходит к другой стороне карту без соединения двух точек с заполненной областью?

ответ

0

Чтобы развернуть данные, вы можете использовать numpy.unwrap. Он был разработан именно для этого: развернуть угловые прыжки (в радианах), которые являются артефактами из-за того, как мы используем однозначные функции.

Вам необходимо конвертировать ваши долгот назад и вперед между степенями и радианах для этой работы, но суть заключается в следующем:

import numpy as np 
lon_unwrapped = np.rad2deg(np.unwrap(np.deg2rad(lon))) 

Найдет эти скачки в ваших данных, размер которых превышает 180 градусов, и принять их 360-градусный дополнение. Пример:

np.rad2deg(np.unwrap(np.deg2rad([150,-150]))) 
# array([ 150., 210.]) 

Кроме того, unwrap принимает ndarray данных, и вы можете сказать, что, по которой оси для выполнения распутывания. По умолчанию это последнее измерение, которое, кажется, подходит для вашего случая, где вы хотите развернуть lon[i,:].

+1

Это не совсем дает результат, который я хочу. Вместо этого в итоге получается плавное увеличение с -180 до 180, оно просто добавляет 360 к моим номерам после прыжка. Таким образом, я получаю плавное увеличение, но это от ~ 90 до ~ 240 градусов .... по существу, как вы взяли раздел моего сюжета линии выше после прыжка и просто подняли его, чтобы соответствовать остальной части линии , Итак, я заканчиваю значениями долготы> 180, базовая карта которых просто не строится. – hm8

+0

@ user3826115 да, это то, что он должен делать. Все разумные представления углов на сфере должны просто обертываться должным образом, я не знал, что базовая карта не делает этого:/В этом случае у вас нет другого шанса, чем циклически изменять порядок данных. Опция грубой силы: 'ind = np.where (np.diff (lon [i,:]) <0) [0] +1; lon [i ,:] = np.concatenate ((lon [i, ind:], lon [i,: ind])) ', циклическая перестановка. Вы также можете попробовать что ['addcyclic'] (http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.addcyclic), возможно, это может быть то, что вам нужно после использования распаковки, я не нашел документы очищены. –

Смежные вопросы