Matplotlib#

Visualización#

Para graficar datos y funciones vamos a usar la biblioteca Matplotlib. Vamos a empezar discutiendo algunas de las características más generales del trabajo con esta biblioteca y mostrar algún ejemplo relativamente sencillo. Matplotlib está dividido en tres partes o capas conceptualmente bien delimitadas:

  • Una parte es la que hace el trabajo más pesado administrando cada parte del gráfico (líneas, texto, figuras, etc)

  • Una segunda parte que permite un uso simple de las funciones anteriores: El módulo pyplot.

  • Una tercera parte que se encarga de presentar la figura en el formato adecuado. Esto es lo que se llama el “Backend” y se encarga de mostrar la figura en los distintos sistemas de ventanas, o en formatos de archivos correspondientes. Algunos ejemplos de backend son: PS (copias PostScript®), SVG (Scalable Vector Graphics), Agg (salida PNG de muy buena calidad), Cairo (png, pdf, ps, svg), GTK (interactivo, permite integrar matplotlib con aplicaciones Gtk+, que usa GNOME), PDF, WxWidgets (interactivo), Qt (interactivo).

Nosotros vamos a concentrarnos principalmente en aprender a utilizar pyplot

Antes de empezar#

Documentación#

Podemos revisar la documentacion de Matplotlib aquí

Instalación de la librería necesaria#

!pip install matplotlib -q
import matplotlib.pyplot as plt
import numpy as np

Métodos a utilizar#

Del módulo al que hemos renombrado plt:

  • usaremos el método .title() para añadir un título al plot.

  • usaremos el método .xlabel() para añadir una etiqueta al eje horizontal del plot 2D.

  • usaremos el método .ylabel() para añadir una etiqueta al eje vertical del plot 2D.

  • usaremos el método .legend() para mostrar una leyenda.

Colores#

Python trae los siguietes colores por defecto:

nombre

abreviatura

color

blue

ㅤbㅤ

azul

green

ㅤgㅤ

verde

red

ㅤrㅤ

rojo

cyan

ㅤcㅤ

cian

magenta

ㅤmㅤ

magenta

yellow

ㅤyㅤ

amarillo

black

ㅤkㅤ

negro

white

ㅤwㅤ

blanco

Adicionalmente Matplotlib dispone de muchos más colores aparte de los colores por defecto, lo cuales podemos visualizaar aquí

Colores en formato hexadecimal

Pero matplotlib no solamente acepta el nombre de los colores, sino también su formato hexadecimal.

Podemos ver una lista de colores con su nombre, su formato hexadecimal e incluso su configuración RGB aquí

matplotlib.pyplot#

Scatter Plot#

Para hacer un gráfico nube de puntos, usamos el método .scatter() del módulo plt.

Algunos de los parámetros de este método son:

  • x: escalar, array o lista que indica la primera coordenada de las observaciones

  • y: escalar, array o lista que indica la segunda coordenada de las observaciones

  • c: para cambiar el color de relleno

  • edgecolors: para cambiar el color del contorno

  • alpha: para cambiar la transparencia

  • marker: para cambiar la forma del punto

  • s: para cambiar el tamaño de los puntos (se mide en puntos)

  • linewidths: para cambiar el grosor del contorno

height = [174.3, 153.5, 162.1, 157.9, 174.8, 169.2, 172.0, 160.4, 152.8, 163.3] 
weight = [ 65.7,  59.2,  57.3,  61.5,  77.3,  90.7,  85.4,  63.1,  73.2, 105.5]

plt.title("Alturas vs. pesos")
plt.xlabel("Alturas (cm)")
plt.ylabel("Pesos (kg)")
plt.scatter(x = height, y = weight, 
            c = "black", edgecolors = "red", alpha = 1,
            marker = "o", s = 200, linewidths = 2)
plt.show()
_images/3_2_Matplotlib_12_0.png

Observación. Podríamos mostrar 2 conjuntos diferentes de datos en un gráfico de nube de puntos:

height_boys = [174.3, 153.5, 162.1, 157.9, 174.8, 169.2, 172.0, 160.4, 152.8, 163.3] 
weight_boys = [65.7, 59.2, 57.3, 61.5, 77.3, 90.7, 85.4, 63.1, 73.2, 105.5]

height_girls = [154.2, 156.1, 160.3, 157.9, 162.6, 153.9, 170.1, 165.2, 157.6, 163.5] 
weight_girls = [55.3, 54.2, 47.3, 62.4, 77.5, 60.3, 52.4, 58.1, 50.2, 80.1]

plt.title("Alturas vs. pesos")
plt.xlabel("Alturas (cm)")
plt.ylabel("Pesos (kg)")

plt.scatter(x = height_boys, y = weight_boys, c = "red", marker = "s", s = 100)
plt.scatter(x = height_girls, y = weight_girls, c = "blue", marker = "p", s = 100)

plt.show()
_images/3_2_Matplotlib_14_0.png

Observación. Podemos dibujar cada punto de un tamaño, pasando una lista al parámetro s, También podemos pintar un punto de cada color, pasando como parámetro c una lista de colores:

x = [1, 2, 3, 4, 5, 6, 7]
colors = ["red", "orange", "yellow", "green", "cyan", "blue", "purple"]
sizes = [100, 150, 200, 250, 300, 350, 400]

plt.scatter(x = x, y = x, s = sizes, c = colors, alpha = 1)
plt.title("Diferentes tamaños y colores")
plt.show()
_images/3_2_Matplotlib_16_0.png

Mapa de colores

Mapa de color. Se trata de una lista de colores, donde cada color tiene un valor entre 0 y 100.

Los mapas de colores disponibles en Python pueden verse aquí junto con una breve explicación de cada clase de mapa de color.

También podríamos haber usado un mapa de color para colorear los puntos. Para ello, en vez de una lista de colores, necesitaremos indicar en el parámetro cmap el mapa de color a usar y, en el parámetro c indicar una lista o array 1D de valores entre 0 y 100 para indicar así el color de cada punto para el colormap determinado.

colors = np.array([0, 10, 20, 30, 40, 50, 60])

plt.scatter(x = x, y = x, c = colors, cmap = "plasma", s = 200)
plt.title("Mapa de color Plasma")
plt.colorbar()
plt.show()
_images/3_2_Matplotlib_18_0.png

Line Plot#

Para hacer un gráfico line plot, usamos el método .plot() del módulo plt.

Algunos de los parámetros de este método son:

  • x: escalar, array o lista que indica la primera coordenada de las observaciones.

  • y: escalar, array o lista que indica la segunda coordenada de las observaciones

  • color: para cambiar el color de relleno. También podemos referirnos a este parámetro por su diminutivo c

  • fmt: para establecer un formato básico rápidamente como string. Por ejemplo, "or" son círculos rojos. El orden recomendado para introducir el formato de este modo es "[marker][linestyle][color]" aunque también se admite "[color][marker][linestyle]".

  • linewidth: para cambiar el grosor de la línea. También podemos referirnos a este parámetro por su diminutivo lw

  • linestyle: para cambiar el estilo de la línea. También podemos referirnos a este parámetro por su diminutivo ls

  • alpha: para cambiar la transparencia

  • marker: para cambiar la forma del punto. Si no indicamos este parámetro, no se dibujan los puntos.

  • markersize: para cambiar el tamaño de los puntos. También podemos referirnos a este parámetro por su diminutivo ms

  • markeredgecolor: para cambiar el color del contorno del punto. También podemos referirnos a este parámetro por su diminutivo mec

  • markerfacecolor: para cambiar el color de relleno del punto. También podemos referirnos a este parámetro por su diminutivo mfc

linestyle

estilo de línea

"-" o "solid"

sólido

"--" o "dashed"

discontinuo

"-." o "dashdot"

guión-punto

":" o "dotted"

puntos

"None"

sin línea

plt.title("Alturas vs. pesos")
plt.xlabel("Alturas (cm)")
plt.ylabel("Pesos (kg)")
plt.plot(sorted(height), weight, 
            c = "blue", ls = "--", lw = 2,
            marker = "d", ms = 15, mfc = "m")
plt.show()
_images/3_2_Matplotlib_21_0.png

Podríamos obtener el mismo resultado usando el parámetro fmt

plt.title("Alturas vs. pesos")
plt.xlabel("Alturas (cm)")
plt.ylabel("Pesos (kg)")
plt.plot(sorted(height), weight, "d--b", lw = 2,
         markersize = 15, mfc = "m")
plt.show()
_images/3_2_Matplotlib_23_0.png

Observación. En un mismo plot podemos dibujar más de una línea:

l1 = np.array([3, 5, 1, 9])
l2 = np.array([8, 2, 6, 4])

plt.plot(l1, c = "blue")
plt.plot(l2, c = "magenta")
plt.title("2 líneas en 1 plot")
plt.show()
_images/3_2_Matplotlib_25_0.png

Bar Plot#

Para hacer un gráfico de barras, usamos el método .bar() del módulo plt.

Algunos de los parámetros de este método son:

  • x: float, array o lista que indica las categorías o coordenadas de las barras

  • height: float, array o lista que indica las alturas de las barras

  • width: para cambiar la anchura de las barras

  • linewidth: para cambiar el tamaño del borde de las barras

  • bottom: para cambiar el valor vertical mínimo de las barras

  • align: posición de la marca del eje horizontal con respecto a la base de las barras. Por defecto vale “center”

  • color para cambiar los colores de las barras. Si pasamos una lista, podemos asignar un color diferente a cada barra

  • edgecolor: para cambiar el color del borde de las barras

grades = ["Suspenso", "Aprobado", "Notable", "Excelente"]
count = [35, 55, 23, 7]

plt.bar(grades, count, color = ["#ff7f7d", "#ffc07d", "#817dff", "#7dff86"],width=0.5)
plt.xlabel("Notas")
plt.ylabel("Número alumnos")
plt.title("Notas de los alumnos de una clase")
plt.show()
_images/3_2_Matplotlib_27_0.png

Si quisiésemos las barras en horizontal, habrá que usar el método .barh().

plt.barh(grades, count, color = ["#ff7f7d", "#ffc07d", "#817dff", "#7dff86"],height=0.5)
plt.ylabel("Notas")
plt.xlabel("Número alumnos")
plt.title("Notas de los alumnos de una clase")
plt.show()
_images/3_2_Matplotlib_29_0.png

Pie Chart#

Para hacer un gráfico de sectores, usamos el método .pie() del módulo plt.

Algunos de los parámetros de este método son:

  • x: array 1D o lista

  • labels: para especificar las etiquetas

  • colors: para cambiar los colores de los sectores. Si pasamos una lista, podemos asignar un color diferente a cada sector circular

  • autopct: para editar el formato en que se muestra el porcentaje

  • labeldistance: para ajustar la distancia radial de las etiquetas

  • radius: para modificar el radio del gráfico

  • startangle: para cambiar el ángulo (en grados) con el que se empieza (por defecto es 0)

  • explode: vector de distancias para indicar cómo de separado queremos que esté el sector correspondiente del resto.

  • shadow: para añadir sombra a los sectores

options = ["Con", "Sin"]
count = [20, 80] 

plt.pie(count, colors = ["#ff85b0", "#85ffac"], labels = options, autopct = "%0.3f%%",explode = [0.2,0], shadow = True)
plt.title("¿Pizza con o sin piña?")
plt.legend(title = "Opciones")
plt.show()
_images/3_2_Matplotlib_31_0.png

Histogram#

Para hacer un histograma, usamos el método .hist() del módulo plt.

Algunos de los parámetros de este método son:

  • x: array o lista de observaciones

  • bins: para especificar el tamaño de los intervalos

  • range: para especificar el mínimo y el máximo de las bins.

  • histtype: para indicar qué tipo de histograma queremos dibujar

  • align: para configurar la alineación de las barras del histograma

  • orientation: para modificar la orientación del histograma (vertical u horizontal)

  • color: para modificar el color de las barras

  • edgecolor: para modficar el color de contorno de las barras

data = np.random.randint(200, size = 100)

plt.hist(data, bins = 10, range = (0, 200), color = "#ff85b0", edgecolor = "k")
plt.show()
_images/3_2_Matplotlib_33_0.png

Múltiples Plots#

El método .subplot() de plt#

Con el método .subplot() podemos dibujar múltiples plots en una misma figura.

Este método toma 3 parámetros que describen la layout de la figura. La layout se organiza en filas y columnas, que son las representadas por los dos primeros parámetros. El tercer parñametro representa el índice que ocupa el plot actual.

l1 = np.array([3, 5, 1, 9])

l2 = np.array([8, 2, 6, 4])

# plot 1
plt.subplot(1, 2, 1)
plt.title("Subplot 1")
plt.plot(l1, c = "magenta", ls = ":", lw = 2)

# plot 2
plt.subplot(1, 2, 2)
plt.title("Subplot 2")
plt.plot(l2, c = "blue", ls = "--", lw = 2)

plt.suptitle("2 Subplots en una figura")

plt.show()
_images/3_2_Matplotlib_36_0.png
fig, (ax1, ax2) = plt.subplots(2, 4, figsize=(12, 8))

# plot 1
plt.subplot(2, 4, 1)
plt.plot(l1, c = "magenta", ls = ":", lw = 2)

# plot 2
plt.subplot(2, 4, 6)
plt.plot(l2, c = "blue", ls = "--", lw = 2)

plt.show()
_images/3_2_Matplotlib_37_0.png

El método .add_subplot() de plt#

Con el método add_subplot() también podemos dibujar múltiples plots en una misma figura.

Para ello tendremos que seguir los siguientes pasos:

  • Crear el objeto figure con el método .figure(), podemos revisar la documentación aquí

  • Indicar el número de filas y de columnas que queremos con el método .add_gridspec()

  • Crear tantos subplots como queramos mostrar con el método .add_subplot() e indicar las posiciones que van a tomar cada uno de ellos

# Creamos el objeto figure
fig = plt.figure(constrained_layout = True)

# Configuramos que tendrá 3 filas y 4 columnas
gs = fig.add_gridspec(3, 4)

# Creamos los subplots. En este caso 3
# * Ocupa todas las filas y todas las columnas salvo la última
fig_ax1 = fig.add_subplot(gs[:, :-1])
fig_ax1.set_title("gs[:, :-1]")
# * Ocupa todas las filas salvo la última y la última columna
fig_ax2 = fig.add_subplot(gs[:-1, -1])
fig_ax2.set_title("gs[:-1, -1]")
# * Ocupa la última fila y la última columna
fig_ax3 = fig.add_subplot(gs[-1, -1])
fig_ax3.set_title("gs[-1, -1]")

plt.show()
C:\Miniconda3\envs\tesis\lib\site-packages\IPython\core\pylabtools.py:151: UserWarning: constrained_layout not applied.  At least one axes collapsed to zero width or height.
  fig.canvas.print_figure(bytes_io, **kw)
_images/3_2_Matplotlib_39_1.png

Ejemplo Aplicativo#

grades = ["Suspenso", "Aprobado", "Notable", "Excelente"]
count = [35, 55, 23, 7]

# Creamos el objeto figure
fig = plt.figure(constrained_layout = True,figsize=(12,8))

# Configuramos que tendrá 4 filas y 5 columnas
gs = fig.add_gridspec(4, 5)

# Creamos los subplots
# * Ocupa todas las filas y las 3 primeras columnas
fig_ax1 = fig.add_subplot(gs[:, :3])
fig_ax1.bar(grades, count, color = ["#ff7f7d", "#ffc07d", "#817dff", "#7dff86"])
fig_ax1.set_title("Gráfico de barras (subplot 1)")
fig_ax1.set_xlabel("Notas")
fig_ax1.set_ylabel("Número de alumnos")

# * Ocupa las dos primeras filas y las últimas dos columnas
fig_ax2 = fig.add_subplot(gs[:2, 3:])
fig_ax2.pie(count, colors = ["#ff7f7d", "#ffc07d", "#817dff", "#7dff86"], 
            labels = grades, autopct = "%1.0f%%")
fig_ax2.set_title("Gráfico de sectores (subplot 2)")

# * Ocupa las dos últimas filas y las dos últimas columnas
fig_ax3 = fig.add_subplot(gs[2:, 3:])
fig_ax3.barh(grades, count, color = ["#ff7f7d", "#ffc07d", "#817dff", "#7dff86"])
fig_ax3.set_title("Gráfico de barras (subplot 3)")

plt.show()
_images/3_2_Matplotlib_41_0.png