Manual de introducción a matplotlib.pyplot (VII): Tipos de gráfico (IV)

Esto pretende ser un tutorial del módulo pyplot de la librería matplotlib. El tutorial lo dividiremos de la siguiente forma (que podrá ir cambiando a medida que vayamos avanzando).

  1. Primeros pasos
  2. Creando ventanas, manejando ventanas y configurando la sesión
  3. Configuración del gráfico
  4. Tipos de gráfico I
  5. Tipos de gráfico II
  6. Tipos de gráfico III
  7. Tipos de gráfico IV
  8. Texto y anotaciones (arrow, annotate, table, text...)
  9. Herramientas estadísticas (acorr, cohere, csd, psd, specgram, spy, xcorr, ...)
  10. Eventos e interactividad (connect, disconnect, ginput, waitforbuttonpress...)
  11. Miscelánea

[Para este tutorial se ha usado python 2.7.1, ipython 0.11, numpy 1.6.1, matplotlib 1.1.0, netcdf4-python 0.9.9 y Basemap 1.0.2]

[DISCLAIMER: Muchos de los gráficos que vamos a representar no tienen ningún sentido físico y los resultados solo pretenden mostrar el uso de la librería].

En todo momento supondremos que se ha iniciado la sesión y se ha hecho

import matplotlib.pyplot as plt
import numpy as np
import netCDF4 as nc
from mpl_toolkits.basemap import Basemap as Bm

Hasta ahora hemos visto como configurar las ventanas, manejo de las mismas, definir áreas de gráfico, algunos tipos de gráficos... Ahora vamos a ver un último capítulo sobre tipos de gráficos. En esta última entrada sobre los tipos de gráfico hemos metido gráficos que quizá no estén muy relacionados entre sí por lo que quizá este capítulo puede parecer un poco cajón desastre.

Anteriormente ya hemos usado Basemap, un toolkit que da capacidades de generar mapas a matplotlib. En este momento vamos a volver a recurrir a esta librería para mostrar datos sobre mapas. En el primer caso vamos a dibujar gráficos de barbas de viento (wind barbs) sobre un mapa. También vamos a usar la librería netcdf4-python, que permite leer, modificar y crear ficheros netcdf así como descargarlos desde diferentes TDS (servidores de datos THREDDS) de forma muy sencilla. Los datos que usaremos serán datos de viento obtenidos del reanálisis CFSR de la atmósfera pero podéis usar cualquier otro tipo de datos que se os ocurra:

plt.ion()  # Ponemos el modo interactivo
url = 'http://nomads.ncdc.noaa.gov/thredds/dodsC/cfsr1hr/200912/wnd10m.l.gdas.200912.grb2' # Ruta al fichero que usaremos
datos = nc.Dataset(url) # Accedemos a los datos

El fichero al que hemos accedido no es un fichero netcdf, sino que tiene formato grib2, pero netcdf4-python es 'todoterreno' y nos permite también acceder a este tipo de ficheros. Los datos a los que corresponden a diciembre de 2009 con pasos temporales de 6 horas. Usaremos solo el campo de vientos que corresponde a las 00:00 UTC del 01/12/2009. Si ponéis en el prompt datos.variables veréis un diccionario con las variables disponibles. Vamos a usar 'U-component_of_wind', 'V-component_of_wind', 'lon' y 'lat'.

u = datos.variables['U-component_of_wind'][0,:,:,:] # Guardamos en memoria el valor u del vector de viento para las 00:00 UTC del 01/12/2009
v = datos.variables['V-component_of_wind'][0,:,:,:] # Guardamos en memoria el valor v del vector de viento para las 00:00 UTC del 01/12/2009
lon = datos.variables['lon'][:] # Guardamos los valores de longitud
lat = datos.variables['lat'][:] # Guardamos los valores de latitud
lons, lats = np.meshgrid(lon, lat) # Hacemos una malla regular 2D para las latitudes y las longitudes

Una vez que disponemos de todas las variables pasamos a hacer el gráfico representando las barbas de viento. Como en diciembre hace mucho frío por Europa vamos a ver los vientos veraniegos que tuvimos en América Central y en América del sur durante en esa fecha.

m = Bm(llcrnrlon = 230, llcrnrlat = -60, urcrnrlon = 340, urcrnrlat = 38, projection = 'mill') # Definimos el área del gráfico y la proyección
m.drawparallels(np.arange(-180,180,10),labels=[1,1,0,0]) # Dibujamos los paralelos
m.drawmeridians(np.arange(0,360,10),labels=[0,0,0,1]) # Dibujamos los meridianos
m.bluemarble() # Ponemos un mapa 'bonito' de fondo
x, y = m(lons, lats)
m.barbs(x,y,u[0,:,:],v[0,:,:],length=5,barbcolor='w',flagcolor='w',linewidth=0.5) # Y dibujamos los valores del vector viento

El resultado quedaría de la siguiente forma:

Y un detalle de la parte sur:

El código completo del ejemplo:

import matplotlib.pyplot as plt
import numpy as np
import netCDF4 as nc
from mpl_toolkits.basemap import Basemap as Bm
plt.ion()  # Ponemos el modo interactivo
url = 'http://nomads.ncdc.noaa.gov/thredds/dodsC/cfsr1hr/200912/wnd10m.l.gdas.200912.grb2' # Ruta al fichero que usaremos
datos = nc.Dataset(url) # Accedemos a los datos
u = datos.variables['U-component_of_wind'][0,:,:,:] # Guardamos en memoria el valor u del vector de viento para las 00:00 UTC del 01/12/2009
v = datos.variables['V-component_of_wind'][0,:,:,:] # Guardamos en memoria el valor v del vector de viento para las 00:00 UTC del 01/12/2009
lon = datos.variables['lon'][:] # Guardamos los valores de longitud
lat = datos.variables['lat'][:] # Guardamos los valores de latitud
lons, lats = np.meshgrid(lon, lat) # Hacemos una malla regular 2D para las latitudes y las longitudes
m = Bm(llcrnrlon = 230, llcrnrlat = -60, urcrnrlon = 340, urcrnrlat = 38, projection = 'mill') # Definimos el área del gráfico y la proyección
m.drawparallels(np.arange(-180,180,10),labels=[1,1,0,0]) # Dibujamos los paralelos
m.drawmeridians(np.arange(0,360,10),labels=[0,0,0,1]) # Dibujamos los meridianos
m.bluemarble() # Ponemos un mapa 'bonito' de fondo
x, y = m(lons, lats)
m.barbs(x,y,u[0,:,:],v[0,:,:],length=5,barbcolor='w',flagcolor='w',linewidth=0.5) # Y dibujamos los valores del vector viento

En realidad no hemos usado 'matplotlib.pyplot.barbs' sino que hemos hecho uso de 'barbs' dentro de 'basemap' pero su uso es similar. Si no queréis dibujar barbas y queréis dibujar flechas echadle un ojo a matplotlib.pyplot.quiver y a matplotlib.pyplot.quiverkey (aquí tenéis ejemplos que os pueden ayudar http://matplotlib.github.com/basemap/users/examples.html).

Podéis encontrar muchos ejemplos de como usar matplotlib.pyplot (en algunos casos usando pylab) en http://matplotlib.sourceforge.net/examples/pylab_examples/index.html.

Y, después de este breve entrada, hemos acabado por hoy y hemos acabado los tipos de gráfico que vamos a ver. Esto ha sido solo una muestra de las cosas que se suelen usar más. El próximo día veremos como hacer anotaciones en un gráfico. Si quieres ver las anteriores entregas del tutorial pulsa aquí.

Kiko Correoso

Licenciado y PhD en Ciencias Físicas, especializado en temas de física, meteorología, climatología, energías renovables, estadística, aprendizaje automático, análisis y visualización de datos. Apasionado de Python y su comunidad. Fundador de pybonacci y editor del sitio en el que se divulga Python, Ciencia y el conocimiento libre en español.

More Posts

Follow Me:
TwitterLinkedIn

3 thoughts on “Manual de introducción a matplotlib.pyplot (VII): Tipos de gráfico (IV)

  1. Pingback: Bitacoras.com
  2. Hola Juan Luis, excelente sitio gracias y felicitaciones por Tu esfuerzo y hacer posible . Repasé cada línea y funciona muy bien. Pero como se hace para guardar el valor del punto de grilla o pixel de por ejemplo lat-14 y lon 75 en un archivo txt. Y como le pongo en lugar de barbas de viento contraste de color e isolineas y su respectiva colorbar.
    Saludos

  3. Hola.

    Por partes:

    1) Soy Kiko, no Juanlu, 😛
    2) lat, lon son vectores y lats, lons son arrays, de ellos puedes extraer los valores que quieras.
    3) Para guardar la info en un fichero te recomiendo que empieces por lo básico: http://docs.python.org.ar/tutorial/3/inputoutput.html#leyendo-y-escribiendo-archivos
    4) Para dibujar contornos le puedes echar un vistazo a http://pybonacci.org/2012/04/14/ejemplo-de-uso-de-basemap-y-netcdf4/
    5) Para dibujar barras de colores puedes usar colorbar. Mira un ejemplo aquí: http://pybonacci.org/2012/07/01/manual-de-introduccion-a-matplotlib-pyplot-vi-tipos-de-grafico-iii/

    Saludos.

Leave a Reply

Your email address will not be published. Required fields are marked *