Proyección de mapas e interpolación forzada.

Tengo un comportamiento extraño usando diferentes proyecciones de Basemap.

La cuadrícula de medidas que quiero trazar en un mapamundi es de forma [181,83]. Eso significa que tengo valores para cada punto 2 ° / 2 °, que van desde -180 ° – 180 ° de longitud y -82 ° – 82 ° de latitud.

from mpl_toolkits.basemap import Basemap import numpy as np measurementgrid = np.random.random_sample((181,83)) m = Basemap(projection='cyl',llcrnrlon=-180, llcrnrlat=-82, urcrnrlon=180, urcrnrlat=82, resolution='l') m.drawcoastlines() m.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0]) m.drawmeridians(np.arange(-180,180,45), labels=[0,0,0,1]) data, x, y = m.transform_scalar(measurementgrid.T, lons=np.arange(-180,182,2), lats=np.arange(-82,84,2), nx = 181, ny = 83, returnxy=True, order=0) m.imshow(data, origin='lower', interpolation='none') 

Usando la proyección cilíndrica, la cuadrícula de datos devueltos es igual a la red de medición y todo está bien. Si cambio la proyección a “fresado”, los datos interpolados resultantes difieren de su origen.

¿Hay una manera de trazar la cuadrícula de medición tal como es pero con respecto a la proyección cambiante?

En primer lugar, te animo a que comiences a usar pcolormesh, en lugar de hacerlo. Pcolormesh debería ser su herramienta de visualización de acceso cuando intente trazar datos de cuadrícula en cuadros (como contornear al dibujar datos de cuadrícula como áreas de valor iso).

Para utilizar pcolormesh, debe pasar por las coordenadas de las esquinas x e y de sus datos, de modo que:

 x = np.linspace(-180, 180, 182) y = np.linspace(-90, 90, 84) m.pcolormesh(x, y, data) 

Pero con el mapa base, siempre debe transformar las coordenadas en el sistema de coordenadas del mapa. En última instancia, esto podría significar que tanto las coordenadas x como las yy deben ser matrices bidimensionales, así que hacemos eso y convertimos:

 x = np.linspace(-180, 180, 182) y = np.linspace(-90, 90, 84) x, y = np.meshgrid(x, y) converted_x, converted_y = m(x, y) m.pcolormesh(converted_x, converted_y, data) 

Lo que eso significa es que ahora puede seguir adelante y cambiar la proyección, y sus datos se trazarán en el lugar correcto. Por ejemplo, cambié la proyección a “robin” (Robinson) y obtuve la siguiente imagen:

Salida de mi arreglo

Desafortunadamente, pcolormesh es para bloques de datos contiguos , que si selecciona una proyección que no comparte la misma longitud central (también conocida como “lon_0”), obtendrá malos resultados. Por ejemplo, cambié la proyección a projection='robin',lon_0=180 y obtuve la siguiente imagen:

Mala línea de datos

Esto se debe a que el mapa de base no maneja actualmente la línea de datos y, por lo que puedo ver, sin una reescritura importante, nunca lo será.

La buena noticia es que esta es un área que me ha molestado durante mucho tiempo, así que comencé a escribir un nuevo paquete para manejar esto y muchas otras peculiaridades de la cartografía para la visualización científica. El resultado es un nuevo paquete, llamado cartopy, que hace mucho más trabajo para usted, por lo que cosas como la línea de datos “simplemente funcionan”:

 import numpy as np import cartopy.crs as ccrs import matplotlib.pyplot as plt x = np.linspace(-180, 180, 182) y = np.linspace(-90, 90, 84) measurement_grid = np.random.random_sample((83, 181)) * y[:-1, np.newaxis] ** 2 plt.axes(projection=ccrs.Robinson(central_longitude=180)) plt.pcolormesh(x, y, measurement_grid, transform=ccrs.PlateCarree()) plt.gca().coastlines() plt.show() 

Salida de cartopy

Aunque no estoy sugiriendo que cambie a cartopy ahora (la instalación y el rendimiento aún están en proceso): vale la pena saber que el paquete existe, y espero que en el futuro se vuelva más y más atractivo a medida que se encuentre con estos tipos. de cuestiones. http://scitools.org.uk/cartopy/docs/latest

También vale la pena señalar que muchos de los problemas que ocurren con la visualización científica de los datos de la cuadrícula vienen en el manejo de los datos, sus coordenadas y sus sistemas de coordenadas subyacentes, por lo que se ha escrito otro paquete que implementa un modelo de datos para resumir todos los datos. de esta información compleja en un solo objeto que luego se puede pasar a trazar rutinas para una interfaz simple. Una vez más, le recomiendo que lo mire en http://scitools.org.uk/iris/docs/latest .

HTH