Как построить нерегулярное 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
Другие вопросы по тегам