01 01 Intro DataScience Matplotlib
01 01 Intro DataScience Matplotlib
01 01 Intro DataScience Matplotlib
(Lo anterior configura Matplotlib para que muestre figuras en el notebook, en lugar de en una ventana nueva.
Más detalles abajo)
Introducción
Matplotlib es una excelente librería gráfica 2D y 3D. Algunas de las muchas ventajas de esta librería son:
Una de las características claves de Matplotlib y que hace a esta librería altamente adecuada para generar
figuras para publicaciones científicas es que todos los aspectos de la figura pueden ser controlados
programando. Esto es importante para la reproducibilidad y conveniente cuando se necesita regenerar la figura
con datos actualizados o cambios en su apariencia.
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 1/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
Esta API está diseñada para que sea compatible con las funciones para graficar de Matlab, de modo que resulta
fácil para aquellos acostumbrados a usar este software.
Ejemplo
Una figura simple usando la API tipo Matlab:
In [3]: plot(1,1)
Si bien el gráfico anterior se creó, el "punto" de coordenadas (1,1) se representa con un punto "invisible".
Podemos cambiar el marcador usado con la opción marker :
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 2/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
Podemos graficar más puntos en el mismo gráfico entrando la lista de las componentes horizontales y
verticales. Por ejemplo, el código
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 3/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
grafica los puntos con coordenadas (1,1) y (2,2), usando el marcador indicado. Por defecto, plot une los
puntos por una recta.
En general, podemos graficar muchos puntos simplemente indicando el arreglo de las coordenadas horizontales
y verticales. En el siguiente ejemplo, se define un arreglo que divide el intervalo x ∈ [0, 5] en 50 elementos, y
grafica los puntos correspondientes a la función cuadrática evaluada en cada punto:
Podemos agregar un título, etiquetas para los ejes, y una grilla, usando title , xlim , ylim y grid :
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 4/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [7]: plot(x,y,color='red')
xlabel('x')
ylabel('y')
title(u'Título') # el caracter `u` es necesario para incluir acentos en el tex
to
grid()
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 5/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [8]: plot(x,y,color='red')
xlabel(r'$\alpha$', fontsize=15) # el caracter `r` ("raw") es necesario para
asegurar que los comandos LaTeX sean reconocidos correctamente
ylabel(r'$\beta(\alpha)$', fontsize=15) # fontsize define el tamaño de los car
acteres usados
title(u'Título') # el caracter `u` es necesario para incluir acentos en el tex
to
grid()
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 6/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [9]: plot(x,y,color='red')
plot(x,sin(y),color='green')
xlabel(r'$\alpha$', fontsize=15) # el caracter `r` ("raw") es necesario para
asegurar que los comandos LaTeX sean reconocidos correctamente
ylabel(r'$\beta(\alpha)$', fontsize=15) # fontsize define el tamaño de los car
acteres usados
title(u'Título') # el caracter `u` es necesario para incluir acentos en el tex
to
grid()
Las etiquetas de cada conjunto de puntos puede ser agregada usando labels y legend :
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 7/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
La posición de las etiquetas puede ser controlado con la opción loc de legend :
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 8/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
La mayoría de las funciones gráficas de Matlab están includas en el módulo pyplot . Por ejemplo, las
funciones subplot y color/symbol :
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 9/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [12]: subplot(1,2,1)
plot(x, y)
grid()
subplot(1,2,2)
plot(y, x)
Lo positivo de la API Pyplot es que es fácil comenzar, y que requiere un mínimo de código para producir gráficos
simples.
Sin embargo, esta API no es la más adecuada cuando se requiere producir gráficos complejos y/o se requiere
controlar cada aspecto del gráfico. En este caso, es recomendable aprender y usar la API gráfica orientada al
objeto de Matplotlib. Es muy poderosa y agradable de usar en caso de requerir figuras avanzadas, con sub-
gráficos, objetos insertados y otros componentes. Más detalles abajo.
Por ejemplo, para crear una figura de 800 por 400 pixels podemos usar:
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 10/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
Guardando figuras
Para guardar una figura en un archivo podemos usar savefig :
In [14]: plot(x,y)
savefig("archivo.png")
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 11/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
Podemos, en forma opcional, especificar los dpi, además de elegir entre varios formatos.
In [16]: fig.savefig("archivo.svg")
¿Qué formatos están disponibles y cuáles deberían ser usados para objener la
mejor calidad?
Matplotlib puede crear gráficos de alta calidad en varios formatos, incluyendo PNG, JPG, EPS, SVG y PDF.
Para publicaciones científicas, se recomienda usar PDF donde sea posible (y compilar documentos LaTeX con
pdflatex , que puede incluir las figuras en PDF usando el comando includegraphics ).
Colores
En Matplotlib podemos definir los colores de las líneas y otros elementos gráficos de distintas maneras. Primero,
podemos usar la sintaxis tipo MATLAB donde 'b' significa azul (blue) 'g' significa verde (green), etc. La API
MATLAB para seleccionar tipos de línea también está disponible: por ejemplo 'b.-' significa línas con puntos
azules.
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 12/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
También podemos definir colores por su nombre o sus códigos RGB, y opcionalmente suministrar un valor alfa,
usando los argumentos color y alpha :
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 13/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 14/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
# posibles símbolos de marcadores: '+', 'o', '*', 's', ',', '.', '1', '2',
'3', '4', ...
plot(x, x+ 9, color="green", lw=2, ls='-', marker='+')
plot(x, x+10, color="green", lw=2, ls='-', marker='o')
plot(x, x+11, color="green", lw=2, ls='-', marker='s')
plot(x, x+12, color="green", lw=2, ls='-', marker='1')
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 15/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
subplot(1, 3, 1)
plot(x, x**2)
plot(x, x**3)
title("rango de ejes por defecto")
subplot(1, 3, 2)
plot(x, x**2)
plot(x, x**3)
axis('tight')
title("ejes apretados")
subplot(1, 3, 3)
plot(x, x**2)
plot(x, x**3)
ylim([0, 60])
xlim([2, 5])
title("rango de ejes personalizado");
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 16/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
En Matplotlib existen muchos métodos más avanzados para controlar la ubicación de los ticks mayores y
menores, como por ejemplo la ubicación automática de acuerdo a distintos criterios. Ver
http://matplotlib.org/api/ticker_api.html ([http://matplotlib.org/api/ticker_api.htm) para más detalles.
Mallas de ejes
Como vimos, grid nos permite activar y desactivar las líneas de malla (grid). También podemos personalizar
la apariencia de las líneas de malla, usando los mismos argumentos que usamos previamente con la función
plot .
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 17/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [22]: subplot(1,2,1)
# apariencia por defecto de la malla
plot(x, x**2, lw=2)
plot(x, x**3, lw=2)
grid(True)
subplot(1,2,2)
# apariencia personalizada de la malla
plot(x, x**2, lw=2)
plot(x, x**3, lw=2)
grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5)
In [23]: n = array([0,1,2,3,4,5])
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 18/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [24]: figure(figsize=(10,4))
subplot(1,4,1)
scatter(n, n**2)
subplot(1,4,2)
step(n, n**2, lw=2)
subplot(1,4,3)
bar(n, n**2, align="center", width=0.5, alpha=0.5)
subplot(1,4,4)
fill_between(x, x**2, x**3, color="green", alpha=0.5);
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 19/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
Notas de texto
Se pueden incluir notas de texto en figuras de Matplotlib usando la función text . Tal como los textos en las
etiquetas, leyendas, y títulos, incluye soporte para texto en formato LaTeX:
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 20/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
def flux_qubit_potential(x,y):
return 2 + alpha - 2 * cos(2*pi*x)*cos(2*pi*y) - alpha*cos(phi-2*x)
pcolor
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 21/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [29]: pcolor(X, Y, Z)
colorbar()
imshow
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 22/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
contour
In [31]: contour(Z)
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 23/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
Figuras 3D
Para producir gráficos 3D con Matplotlib, primero debemos crear una instancia de ejes de la clase Axes3D .
Ejes 3D pueden ser agregados al marco de una figura de Matplotlib de la misma forma que para ejes 2D axes.
Sin embargo, una forma conveniente para crear una instancia de eje 3D es usar el argumento
projection='3d' en las funciones add_axes o add_subplot .
Gráficos de superficies
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 24/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 25/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 26/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [36]: figure(figsize=(12,6))
ax=subplot(1,2,1, projection='3d')
ax.plot_surface(X, Y, Z, rstride=4, cstride=4, alpha=0.25)
ax.view_init(30, 45)
ax=subplot(1,2,2, projection='3d')
ax.plot_surface(X, Y, Z, rstride=4, cstride=4, alpha=0.25)
ax.view_init(70, 30)
Para usar la API orientada al objeto comenzamos similarmente al ejemplo anterior, pero en lugar de crear una
instancia de figura global almacenamos una referencia a la figura recién creada en la variable fig , y a partir de
ella creamos nuevos ejes axes usando el método add_axes en la instancia fig de la clase Figure .
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 27/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
ejes.plot(x,y,'r')
ejes.set_xlabel('x')
ejes.set_ylabel('y')
ejes.set_title(u'Título');
Aunque se requiere algo más de código, la ventaja es que ahora tenemos control completo sobre dónde se
ubican los ejes, y además podemos agregar fácilmente más de un eje a la figura.
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 28/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
# figura principal
axes1.plot(x,y,'r')
axes1.set_xlabel('x')
axes1.set_ylabel('y')
axes1.set_title(u'Título principal')
# figura insertada
axes2.plot(y,x,'g')
axes2.set_xlabel('y')
axes2.set_ylabel('x')
axes2.set_title(u'Título secundario');
Si no nos importa ser explícitos sobre dónde estarán ubicados los ejes en el marco de nuestra figura, podemos
usar uno de los muchos administradores de la distribución de los ejes que tiene Matplotlib. Un favorito es
subplots , que puede ser usado de la forma siguiente:
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 29/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [39]: fig, axes = subplots() # crea una nueva figura y un set de ejes
axes.plot(x,y,'r')
axes.set_xlabel('x')
axes.set_ylabel('y')
axes.set_title(u'Título');
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 30/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
In [40]: # crea una figura, con dos set de ejes, almacenados en el array axes
fig, axes = subplots(nrows=1, ncols=2)
for ax in axes:
ax.plot(x, y, 'r')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title(u'Título');
Fácil, pero no tan bonito debido a la superposición de los ejes y etiquetas en la parte central, cierto?
Podemos mejorar esto usando el método fig.tight_layout , que ajusta automáticamente la posición de los
ejes en el marco de la figura de modo que no exista contenido que se superponga:
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 31/32
18/3/2020 01_01_Intro_DataScience_Matplotlib
for ax in axes:
ax.plot(x, y, 'r')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title(u'Título')
fig.tight_layout()
Lectura adicional
http://www.matplotlib.org (http://www.matplotlib.org) - La página del proyecto Matplotlib.
https://github.com/matplotlib/matplotlib (https://github.com/matplotlib/matplotlib) - El código fuente de
Matplotlib.
http://matplotlib.org/gallery.html (http://matplotlib.org/gallery.html) - Una gran galería que muestra los tipos
de gráficos que Matplotlib puede crear. ¡Altamente recomendado!
http://www.loria.fr/~rougier/teaching/matplotlib/ (http://www.loria.fr/~rougier/teaching/matplotlib/) - Un buen
tutorial de Matplotlib.
file:///C:/Users/fsanmartin/Downloads/01_01_Intro_DataScience_Matplotlib.html 32/32