Representación de océanos en mapas utilizando mapas base y python

Estoy trazando el archivo netCDF disponible aquí: https://goo.gl/QyUI4J

Usando el siguiente código, el mapa se ve así: introduzca la descripción de la imagen aquí

Sin embargo, quiero que los océanos sean de color blanco. Mejor aún, quiero poder especificar en qué color se muestran los océanos. ¿Cómo cambio el código de abajo para hacer eso? En este momento, el problema es que los océanos se trazan en la escala de datos. (Tenga en cuenta que el archivo netCDF es enorme ~ 3.5 GB).

import pdb, os, glob, netCDF4, numpy from matplotlib import pyplot as plt from mpl_toolkits.basemap import Basemap def plot_map(path_nc, var_name): """ Plot var_name variable from netCDF file :param path_nc: Name of netCDF file :param var_name: Name of variable in netCDF file to plot on map :return: Nothing, side-effect: plot an image """ nc = netCDF4.Dataset(path_nc, 'r', format='NETCDF4') tmax = nc.variables['time'][:] m = Basemap(projection='robin',resolution='c',lat_0=0,lon_0=0) m.drawcoastlines() m.drawcountries() # find x,y of map projection grid. lons, lats = get_latlon_data(path_nc) lons, lats = numpy.meshgrid(lons, lats) x, y = m(lons, lats) nc_vars = numpy.array(nc.variables[var_name]) # Plot! m.drawlsmask(land_color='white',ocean_color='white') cs = m.contourf(x,y,nc_vars[len(tmax)-1,:,:],numpy.arange(0.0,1.0,0.1),cmap=plt.cm.RdBu) # add colorbar cb = m.colorbar(cs,"bottom", size="5%", pad='2%') cb.set_label('Land cover percentage '+var_name+' in '+os.path.basename(path_nc)) plt.show() plot_map('perc_crops.nc','LU_Corn.nc') 

maskoceans usar maskoceans en su conjunto de datos nc_vars

Antes de contourf , inserte este

 nc_new = maskoceans(lons,lats,nc_vars[len(tmax)-1,:,:]) 

y luego llame a contourf con el conjunto de datos recién enmascarado, es decir,

 cs = m.contourf(x,y,nc_new,numpy.arange(0.0,1.0,0.1),cmap=plt.cm.RdBu) 

Para dictar el color del océano, puede descartar la llamada para drawslmask si desea océanos blancos o especificar un color del océano en esa llamada, por ejemplo, insertar m.drawlsmask(land_color='white',ocean_color='cyan') .

He dado el código de trabajo con la menor cantidad posible de modificaciones al suyo a continuación. Descomente la llamada a drawslmask para ver océanos de color cian.

Salida

introduzca la descripción de la imagen aquí

Versión completa de trabajo del código.

 import pdb, os, glob, netCDF4, numpy from matplotlib import pyplot as plt from mpl_toolkits.basemap import Basemap, maskoceans def plot_map(path_nc, var_name): """ Plot var_name variable from netCDF file :param path_nc: Name of netCDF file :param var_name: Name of variable in netCDF file to plot on map :return: Nothing, side-effect: plot an image """ nc = netCDF4.Dataset(path_nc, 'r', format='NETCDF4') tmax = nc.variables['time'][:] m = Basemap(projection='robin',resolution='c',lat_0=0,lon_0=0) m.drawcoastlines() m.drawcountries() # find x,y of map projection grid. lons, lats = nc.variables['lon'][:],nc.variables['lat'][:] # NB I had to substitute the above for unknown function get_latlon_data(path_nc) # I guess it does the same job lons, lats = numpy.meshgrid(lons, lats) x, y = m(lons, lats) nc_vars = numpy.array(nc.variables[var_name]) #mask the oceans in your dataset nc_new = maskoceans(lons,lats,nc_vars[len(tmax)-1,:,:]) #plot! #optionally give the oceans a colour with the line below #Note - if land_color is omitted it will default to grey #m.drawlsmask(land_color='white',ocean_color='cyan') cs = m.contourf(x,y,nc_new,numpy.arange(0.0,1.0,0.1),cmap=plt.cm.RdBu) # add colorbar cb = m.colorbar(cs,"bottom", size="5%", pad='2%') cb.set_label('Land cover percentage '+var_name+' in '+os.path.basename(path_nc)) plt.show() plot_map('perc_crops.nc','LU_Corn.nc') 

PS Eso es un archivo grande para probar !!

La buena solución legal es usar la función de utilidad maskoceans , que toma en una matriz de datos y enmascara todos los puntos en océanos y lagos.

En su lugar, podría tomar la salida fácil. Dibuje primero su trazado de contorno, luego use la drawlsmask , que permite colores transparentes:

 # Colors can be RGBA tuples m.drawlsmask(land_color=(0, 0, 0, 0), ocean_color='deeppink', lakes=True) 

La tierra es transparente, lo que permite que la ttwig del contorno se vea a través.

Los colores que usted ve en el mapa están relacionados con el mapa de color cm.plt.RdBu que se pasa a la función contourcf. Necesita cambiar este mapa de colores para lograr los resultados que desea. Aquí puede encontrar un tutorial para el mapa de colores de mapa base.