¿Cómo trazar una imagen RGB con espacios irregulares usando python y el mapa base?

Dado que tengo tres matrices que describen los datos que quiero trazar:

  • lons – matriz 2D con [n_lons, n_lats]
  • lats – matriz 2D con [n_lons, n_lats]
  • dataRGB – matriz 3D con [n_lons, n_lats, 3]

¿Cuál es la forma preferida de trazar dichos datos utilizando python y el mapa base?

Para datos de pseudo-color, esto es bastante simple usando el método pcolormesh:

De la lectura de la documentación, me parece que el comando imshow se debe usar en este caso, pero para este método se necesitan datos de cuadrícula con regularidad y tendría que modificar e interpolar mis datos.

¿Hay alguna otra manera de trazar los datos?

Me encontré con este mismo problema hace un tiempo, y esta es la única solución que podría encontrar:

(Tenga en cuenta que esto funciona con matplotlib 1.3.0, pero no 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 

Suponiendo que var es su variable de interés (NxMx3), lats es (N) x (M) y lons es (N) x (M):

Necesitamos convertir el centro de píxeles lat / lons a la esquina de píxeles lat / lons (N + 1) x (M + 1)

 cornerLats=getCorners(lat);cornerLons=getCorners(lon) 

Obtener esquinas de coordenadas

 xCorners,yCorners=m(cornerLats,cornerLons,inverse=True) 

Enmascara los datos que no son válidos

 var=ma.masked_where(np.isnan(var),var) 

Necesitamos una tupla aplanada (N * M, 3) para pasar a pcolormesh

 colorTuple=tuple(np.array([var[:,:,0].flatten(),var[:,:,1].flatten(),var[:,:,2].flatten()]).transpose().tolist()) 

Establecer un ancho de línea mayor dará como resultado una mayor distorsión del borde, y

un ancho de línea más pequeño resultará en una imagen arruinada por alguna razón

 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