Как построить нерегулярное RGB изображение с использованием Python и базовой карты?
Учитывая, что у меня есть три матрицы, которые описывают данные, которые я хочу построить:
- lons - 2D матрица с [n_lons, n_lats]
- lats - 2D матрица с [n_lons, n_lats]
- dataRGB - 3D матрица с [n_lons,n_lats,3]
Каков предпочтительный способ построения таких данных с использованием Py thon и базовой карты.
Для данных псевдоцвета это довольно просто, используя метод pcolormesh:
данные - 2D матрица с [n_lons, n_lats]
m = базовая карта (...)
m.pcolormesh (Лон, латы, данные, LatLon=True)
Из прочтения документации мне кажется, что в этом случае следует использовать команду imshow, но для этого метода требуются данные с регулярной сеткой, и мне придется пересчитывать и интерполировать свои данные.
Есть ли другой способ нанести данные?
1 ответ
Я столкнулся с этой же проблемой некоторое время назад, и это единственное решение, которое я мог придумать:
(Обратите внимание, что это работает с matplotlib 1.3.0, но не с 1.1.0)
from mpl_toolkits.basemap import Basemap
import numpy.ma as ma
import numpy as np
m = Basemap() #Define your map projection here
Предполагая, что var - это ваша интересующая переменная (NxMx3), lats - (N) x (M), а lons - (N) x (M):
Нам нужно преобразовать центр пикселя широта / долгота в угол пикселя широта / долгота (N+1)x(M+1)
cornerLats=getCorners(lat);cornerLons=getCorners(lon)
Получить координаты углов
xCorners,yCorners=m(cornerLats,cornerLons,inverse=True)
Маска данных, которые являются недействительными
var=ma.masked_where(np.isnan(var),var)
Нам нужен плоский кортеж (N*M,3), чтобы перейти к pcolormesh
colorTuple=tuple(np.array([var[:,:,0].flatten(),var[:,:,1].flatten(),var[:,:,2].flatten()]).transpose().tolist())
Установка большей ширины линии приведет к большему искажению краев, и
меньшая ширина линии по какой-то причине приведет к искажению изображения.
m.pcolormesh(xCorners,yCorners,var[:,:,0],color=colorTuple,clip_on=True,linewidth=0.05)
def getCorners(centers):
one = centers[:-1,:]
two = centers[1:,:]
d1 = (two - one) / 2.
one = one - d1
two = two + d1
stepOne = np.zeros((centers.shape[0] + 1,centers.shape[1]))
stepOne[:-2,:] = one
stepOne[-2:,:] = two[-2:,:]
one = stepOne[:,:-1]
two = stepOne[:,1:]
d2 = (two - one) / 2.
one = one - d2
two = two + d2
stepTwo = np.zeros((centers.shape[0] + 1,centers.shape[1] + 1))
stepTwo[:,:-2] = one
stepTwo[:,-2:] = two[:,-2:]
return stepTwo