Saltar al contenido

De matplotlib a la web con plotly

(También podéis seguir las explicaciones de este post con este Notebook)

En esta entrada trataremos de dar a conocer plotly, un servicio web gratuito para generar gráficos interactivos y que permite la creación de proyectos colaborativos.

Los paquetes que vamos a emplear son,

  • pandas 0.14.0, para importar y analizar estructuras de datos en Python.
  • matplotlib 1.3.1, para generar diversisos tipos de gráficos con calidad de imprenta.
  • plotly 1.1.2, para generar gráficos interactivos para la web.

Empezaremos por importar los datos con pandas. Podeis encontrar una introducción a pandas en éste post de Pybonacci.

Datos

La estructura de datos con la que vamos a trajar es un CSV con datos de telemetría correspondientes a un BMW Z4 GT3 compitiendo en el circuito Brands Hatch Indy. El paquete de datos nos lo ha proporcionado Steve Barker, un mecánico que pasa la mayor parte de su tiempo en la GP2. Pero aquí sólo vamos a trabajar con los datos de la vuelta 27 de la primera carrera.

En el siguiente vídeo podemos ver cómo sería una vuelta a dicho circuito con el mismo modelo de coche.

El propio pandas incluye rutinas para importar datos desde diversas fuentes, ya sea un simple CSV o un Excel de multiples hojas.

Pero antes de proceder a cargar los datos debemos conocer un poco la estructura del archivo en cuestión del que he recortado una muestra.

Como bien podemos apreciar, las primeras 11 líneas aportan información generada por MoTeC al exportar los datos. Las cabeceras de lo que realmente nos interesa son las líneas 14 y 15, siendo la primera la descripción del parámetro y la segunda las unidades de medida. Y ya en la línea 18 empiezan los datos.
Tomaremos como índice del DataFrame la variable tiempo, que sabemos que es la primera columna (aunque también podríamos haber optado por la distancia).

Otra forma alternativa de leer los datos de un archivo CSV sería a través del propio DataFrame de pandas, pero éste no nos permite saltarnos filas de datos:

Si mostramos las primeras filas del archivo con data.head(5), obtendremos algo como

Podemos ver que el archivo es inmenso. Contiene 215 con diferentes parámetros como revoluciones del motor, posición del pedal del acelerador, velocidad, etc. Un sinfín de datos que marearían al más experto de los ingenieros de pista.

De todos modos, aquí no vamos a analizar en detalle la vuelta realizada por Steve Barker, si no que nos centraremos exclusivamente en visualizar los datos.

Gráficas con matplotlib

matplotlib es el paquete más empleado en Python para generar diversos tipos de gráficos de alta calidad. Y es precisamente lo que utiliza pandas para generar sus propias gráficas como veremos a continuación.

Empezamos por importar matplotlib y, de paso, crear un mapa de colores personalizado más vistoso que el que viene por defecto. La idea la he tomado de Randal S. Olson.

Va de velocidad

Una de las primeras cosas que podemos visualizar son la velocidad en función del tiempo junto con otros parámetros relaciones como son la posición de los pedales y las revoluciones del motor.

Lo primero será crear un objeto figura, que necesitaremos para pasarle a plotly, con tres subgráficas para mostrar revoluciones del motor, velocidad del vehículo y posición de los pedales.

Lo que vemos en la gráfica de arriba son tres subgráficas que comparten el mismo eje x. De ese modo podemos ver la relación entre los diversos parámetros.

Relaciones de cambio

Otro tipo de gráfico que nos puede dar mucha información es la relación entre la velocidad del vehículo y las revoluciones del motor.

Para ello podemos utilizar en pandas el tipo scatter y colorear los valores en función de la marcha engranada. Eso lo conseguimos con la herramientas groupby de pandas.

Histograma del acelerador

Mediante un histograma podemos analizar el uso que hace el piloto del pedal del acelerador.

La mayor parte del tiempo, el piloto la pasa con el pedal a fondo.

Gráficas con plotly

Ahora que disponemos de una buena muestra podemos publicar las gráficas en la web con plotly. Podéis encontrar la guía oficial aquí.

plotly ofrece un API excelente para crear gráficas interactivas que pueden ser incluidas en webs y blogs. El paquete no viene incluido en los repositorios de Continuum Analytics (conda) pero se puede instalar de manera muy sencilla con pip:

Para poder utilizar plotly necesitamos una credenciales. Registrarse es gratuito, y ofrecen almacenamiento ilimitado para gráficos públicos. Sin embargo, el número de archivos privados que podemos alojar es limitado en la versión gratuita.
Para mayor comodidad podemos guardar nuestras credenciales en el sistema de modo siguiente,

que rellenaremos con nuestros datos, que encontraremos en la sección

Configuration

de nuestra cuenta. Nuestras credenciales las podremos recuperar, a partir de entonces, de la siguiente manera.

Podemos utilizar plotly de dos maneras. La primera de ellas es generar las gráficas directamente con la API. La segunda, y la que resultará más cómoda para la mayoría, es convertir directamente las figuras generadas con matplotlib.

Para transformar una figura de matplotlib emplearemos el comando py.plot_mpl(fig, resize=True, strip_style=False, update=None, **plot_options). También podemos utilizar la versión py.iplot_mpl() para que nos presente el resultado directamente en el Notebook de IPython.

La URL la podemos incrustar en un blog con un iframe o creando un shortcode para dicho iframe. Para ello, en WordPress, necesitamos crear o editar el archivo functions.php dentro de la carpeta de nuestro tema de WP e incluir las siguientes líneas de código

que emplearíamos de las siguientes maneras

  • [plotly]https://plot.ly/~pfsq/138[/plotly]
  • [plotly height=500]https://plot.ly/~pfsq/139[/plotly]
  • [plotly height=450 id=2]https://plot.ly/~pfsq/140[/plotly]

Hasta donde tengo conocimiento, un blog alojado en WordPress.com no permite incrustar iframe, lo cual es una verdadera pena. Sin embargo, como podéis ver en los enlaces, seguimos contando con un enlace a un gráfico interactivo al que podríamos redirigir pinchando en la imagen generada por matplotlib como hemos hecho con las imágenes arriba.

Retocar plotly

Como podemos ver en las gráficas superiores, la conversión a plotly todavía no es perfecta. El conversor interpreta las leyendas de matplotlib como anotaciones de texto. Por suerte, eso lo podemos subsanar fácilmente.

Necesitaremos importar una serie de paquetes adicionales, disponibles en las versiones >1 de plotly.

Convertimos la figura de matplotlib a una figura de plotly,

y eliminamos todas las anotaciones de texto y añadimos una leyenda en la esquina superior derecha.

Ya podemos publicar la nueva gráfica, ésta vez sólo con py.plot() o py.iplot() pues ya hemos hecho la conversión a plotly unos pasos atrás.

Podéis ver el resultado sin anotaciones en https://plot.ly/~pfsq/141.

Repetimos el procedimiento para la segunda gráfica, pero en esta ocasión colocaremos la leyenda arriba a la izquierda y cambiamos el hovermode a closest.

Con hovermode controlamos cómo se comporta plotly al pasar el ratón por encima de la gráfica. En modo closest nos resaltará el valor más cercano al ratón, y en modo compare, para cada x nos mostrará los diferentes valores que toma la variable.

Pero esta vez tenemos que editar los nombres de los puntos que se muestran en la leyenda.

y ya podemos crear la gráfica,

que podéis ver en https://plot.ly/~pfsq/142

Por último nos falta retocar el histograma de posiciones del pedal del acelerador. En ésta gráfica no quedan anotaciones, pero tampoco necesitamos mostrar la leyenda. Aprovechamos también para hacer las barras más anchar reduciendo el bargap.

Publicamos la gráfica

y podemos disfrutar del resultado en https://plot.ly/~pfsq/143

Próximamente

En una próxima entrega daremos a conocer más en detalle plotly. Explicaremos su estructura de datos, basada en JSON, y enseñaremos a crear gráficas directamente con su API.

3 comentarios en «De matplotlib a la web con plotly»

  1. Pingback: De matplotlib a la web con plotly | Python-es |...

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

− one = 3

Pybonacci