Saltar al contenido

¿Realmente es feo matplotlib?

En los últimos tiempos he estado leyendo en múltiples sitios que matplotlib es feo, que se ve viejuno, que la librería [ponga usted aquí la librería chachiguay que desee] es ‘más mejor’, que es una biblioteca muy pesada,…, pero nunca he leído una argumentación para refutar esas quejas.

Hoy me voy a centrar en la primera queja que he indicado más arriba.

¿Es matplotlib feo?

Cuando se inició el desarrollo de matplotlib el entorno de trabajo era muy diferente al actual. Se hacían gráficas estáticas 2D para ser publicadas en revistas o en la web de hace 10 o más años (ha cambiado un poco el panorama desde entonces). Se inició para ser una alternativa libre a Matlab y es por ello que su API y apariencia es muy parecida a la que ofrece Matlab. De esta forma matplotlib hace gráficos que, de base, son simples y pensados para ser publicados en cualquier sitio sin necesidad de mucha modificación.

A pesar de ofrecer gráficos aceptables de partida (en mi modesta opinión, por supuesto), desde tiempos inmemoriales se puede acceder a la configuración de base y modificarla para el gusto de cada cual. En la versión más antigua que figura en github (0.91.3) podéis encontrar que rcParams ya está por ahí (fichero modificado por última vez en 2007). El que hubiera querido modificar algo de la configuración básica que trae matplotlib lo podría haber hecho sin mucho esfuerzo y hubiera tardado menos que el perdido en escribir una queja por alguna lista de correo, entrada en algún blog, comentario en reddit,…(*)

(*) Ahora con twitter puede que sea más rápido lanzar la queja que modificar eso que tanto te molesta pero seguirá sin haber argumentación, gracias twitter!!

¿Modificar matplotlib a mi gusto?

Siempre ha sido relativamente sencillo, de hecho, en su momento desde Pybonacci creamos un repositorio con algo de código que te ofrecía una serie de decoradores para conseguir nuevos estilos de forma sencilla.

Pero desde la versión 1.4 tenemos disponible el paquete styles que permite cambiar de estilos fácilmente y que trae algunos estilos por defecto. Veamos un poco como funciona todo esto:

Primero de todo hacemos todo el previo de imports y mostrar versiones y demás para que el que quiera pueda reproducir los ejemplos sin problemas.

SoftwareVersion
Python3.4.0 64bit [GCC 4.8.2]
IPython3.0.0-dev
OSLinux 3.13.0 24 generic x86_64 with LinuxMint 17 qiana
matplotlib1.4.2
numpy1.9.1
Sun Jan 25 19:51:49 2015 CET

Un gráfico normal por defecto en matplotlib (de esos que son tan feos) en el notebook de IPython será de la siguiente forma:

Usando el paquete styles modificar la apariencia a uno de los estilos que trae por defecto el paquete sería algo como lo siguiente:

Como habéis visto en la salida anterior disponéis de varios estilos por defecto, ['ggplot', 'bmh', 'grayscale', 'dark_background', 'fivethirtyeight']. Probadlos todos si queréis verlos en vivo o ved este notebook.
Si os gustan los valores por defecto podéis volver a ellos usando plt.rcdefaults().

No me gusta ninguno de los estilos que vienen por defecto

“Siemprrre negatifffos, nunca positifffos”, pero que no cunda el desánimo. Crear tu propio estilo es sencillo. Vamos a ver como podemos crear una hoja de estilos que se adecúe a nuestros gustos.

Si queremos que nuestro nuevo estilo esté siempre disponible cada vez que usemos matplotlib deberemos incluir la hoja de estilos en la carpeta

~/.config/matplotlib/stylelib/. Voy a crearla con IPython (lo hago en Linux, no lo he probado en otros sistemas operativos):

Y ahora vamos a definir un nuevo estilo pybonacci como el que definimos en el repositorio de mpl_styles. Para ello vamos a usar IPython para crear la hoja de estilo que se llamará pybonacci.mplstyle (debe tener la extensión .mplstyle):

Y ahora, supuestamente, deberíamos poder acceder al nuevo estilo creado:

Si veis que no está disponible podéis hacer lo siguiente:

Ahora vamos a recrear el gráfico que definimos en el repositorio de mpl_styles para el estilo pybo que definimos allí:

Que he dicho que no me gusta matplotlib

Si a pesar de todo lo expuesto aquí sigue sin gustarte matplotlib (estás en tu derecho y si lo argumentas en los comentarios lo podré entender mejor) tienes varias posibilidades disponibles:

No pongo Seaborn puesto que se basa en matplotlib.

Saludos a todos.
P.D.: Este notebook y la hoja de estilos que acabamos de crear está disponible en el repo de notebooks de Pybonacci.

9 comentarios en «¿Realmente es feo matplotlib?»

    1. Gracias por el aporte. Como todo se hace desde un notebook de IPython he usado herramientas del notebook que deberían funcionar en win/lin/mac. El notebook tiene acceso a comandos de la shell pero lo he querido hacer paso a paso.
      Saludos.

  1. Interesante y divertida entrada.Yo también he leído en muchos sitios que matplotlib es lento, enorme y tal o cual. No soy un experto en él, ni he usado todas las alternativas 2D que comentas.Sería un buen artículo una comparativa entre ellos.Mi sensación es que no creo que haya ninguno mejor.Lo único que se le puede achacar a matplotlib es su manejo 3D, pero para eso hay otros programas y también miles de alternativas ya que no se diseñó pensando en el 3D.Y romperé una lanza por matplotlib ya que es casi un estándar para Python, y se agradece que haya paquetes que no se dejen de desarrollar, cosa muy habitual en el software libre.Que haya programas que,siendo un poco mejores o un poco peores,tengan visos de continuidad (y mejora,mejora que se aprecia en matplotlib de forma clarísima) es ya para mí una garantía de uso.
    Felicidades por la entrada.Ánimo y un saludo.

    1. -Es pesado, normal, es que hace muchas cosas. Hay que escribir código para que haga todo eso.
      -Es enorme, normal, soporta mucha funcionalidad, backends, eventos, tipos de gráficos, personalización,…
      -Es lento, no es un problema que me haya encontrado hasta ahora y llevo unos cuantos años usándolo.
      -Es feo, No te has leído el post 😛
      Para el tema del 3D tengo pendiente jugar un poco más con three.js, pero eso será otro día.
      Gracias por comentar.
      Saludos.

Responder a kiko Cancelar la respuesta

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

forty nine − 42 =

Pybonacci