preloader

Visualización de datos

Índice de contenido

Importar librerías

python
import matplotlib.pyplot as plt
import numpy as np

Anatomía de una figura en Matplotlib

Matplotlib genera sus datos en Figures (es decir, ventanas o “lienzos” en blanco), cada una de las cuales puede contener uno o más Axes (es decir, ejes de coordenadas xy, o theta-r en una gráfica polar, o xyz en un gráfico 3D, etc.).

anatomy.webp

Figura (figure)

Es todo el conjunto (ejes, títulos, leyendas, lienzo, etc.). Una figura puede contener cualquier número de ejes, pero normalmente tendrá al menos uno.

Ejes (axes)

Es el gráfico propiamente dicho, es decir, la región de la imagen con datos. Una figura determinada puede contener muchos ejes, pero un eje determinado solo puede estar en una figura.

Los ejes, a su vez, contienen dos (o tres en el caso de 3D) objetos Axis (en Matplotlib, Axes y Axis hacen referencia a objetos distintos) que se encargan de los límites de datos (los límites de datos también se pueden controlar mediante los métodos axes.Axes.set_xlim() y axes.Axes.set_ylim()).

Cada eje, además, tiene un título (establecido mediante set_title()), una etiqueta x (establecida mediante set_xlabel()) y una etiqueta y (configurada mediante set_ylabel()).

Ejes (axis)

Son objetos parecidos a una recta numérica que se encargan de establecer los límites del gráfico y generar los ticks (las marcas en el eje) y ticklabels (cadenas de texto que hacen referencia a cada tick).

Objetos artist

Básicamente todo lo que se puede ver en la figura es un artist (incluso los objetos de tipo Figure, Axes y Axis). Cuando se renderiza la figura, todos los artists se dibujan en el lienzo. La mayoría de los artists están atados a ejes; un artist no puede ser compartido por varios ejes, ni moverse de uno a otro.

La interfaz orientada a objetos y la interfaz pyplot

Hay esencialmente dos formas de usar Matplotlib:

  • Creando explícitamente figuras y ejes, y llamando a métodos sobre ellos (el “estilo orientado a objetos (OO)”).
  • Confiando en pyplot para crear y administrar automáticamente las figuras y los ejes, y utilizando las funciones de pyplot para trazar.

Cualquiera de ellos es perfectamente válido, aunque es preferible elegir uno de ellos y ceñirse a él, en lugar de mezclarlos en un mismo script o cuaderno de Jupyter. En general, se recomienda restringir pyplot al trazado interactivo (por ejemplo, en un cuaderno de Jupyter) y preferir el estilo OO para el trazado no interactivo (en funciones y scripts que están destinados a ser reutilizados como parte de un proyecto más grande).

Estilo orientado a objetos (OO)

python
x = np.linspace(0, 2, 100)
x
array([0.        , 0.02020202, 0.04040404, 0.06060606, 0.08080808,
       0.1010101 , 0.12121212, 0.14141414, 0.16161616, 0.18181818,
       0.2020202 , 0.22222222, 0.24242424, 0.26262626, 0.28282828,
       0.3030303 , 0.32323232, 0.34343434, 0.36363636, 0.38383838,
       0.4040404 , 0.42424242, 0.44444444, 0.46464646, 0.48484848,
       0.50505051, 0.52525253, 0.54545455, 0.56565657, 0.58585859,
       0.60606061, 0.62626263, 0.64646465, 0.66666667, 0.68686869,
       0.70707071, 0.72727273, 0.74747475, 0.76767677, 0.78787879,
       0.80808081, 0.82828283, 0.84848485, 0.86868687, 0.88888889,
       0.90909091, 0.92929293, 0.94949495, 0.96969697, 0.98989899,
       1.01010101, 1.03030303, 1.05050505, 1.07070707, 1.09090909,
       1.11111111, 1.13131313, 1.15151515, 1.17171717, 1.19191919,
       1.21212121, 1.23232323, 1.25252525, 1.27272727, 1.29292929,
       1.31313131, 1.33333333, 1.35353535, 1.37373737, 1.39393939,
       1.41414141, 1.43434343, 1.45454545, 1.47474747, 1.49494949,
       1.51515152, 1.53535354, 1.55555556, 1.57575758, 1.5959596 ,
       1.61616162, 1.63636364, 1.65656566, 1.67676768, 1.6969697 ,
       1.71717172, 1.73737374, 1.75757576, 1.77777778, 1.7979798 ,
       1.81818182, 1.83838384, 1.85858586, 1.87878788, 1.8989899 ,
       1.91919192, 1.93939394, 1.95959596, 1.97979798, 2.        ])
python
# Una figura vacía sin ejes
fig = plt.figure(figsize= (12,16))
python
# Una figura con un solo eje
fig, ax = plt.subplots()
ax.plot(x, x, label = "lineal")
ax.plot(x, x**2, label = "cuadrático")
ax.plot(x, x**3, label = "cúbico")
ax.set_xlabel("Etiqueta eje X")
ax.set_ylabel("Etiqueta eje Y")
ax.set_title("Gráfico de ejemplo")
ax.legend()
<matplotlib.legend.Legend at 0xaa97f70>

png

python
# Una figura con una cuadrícula de 2x2 ejes (4 ejes)
_, axes = plt.subplots(2,2)

Estilo pyplot

python
x = np.linspace(0, 2, 100)

plt.plot(x, x, label = "lineal")
plt.plot(x, x**2, label = "cuadrático")
plt.plot(x, x**3, label = "cúbico")
plt.xlabel("Etiqueta eje X")
plt.ylabel("Etiqueta eje Y")
plt.title("Gráfico de ejemplo")
plt.legend()
<matplotlib.legend.Legend at 0xa86de50>

png

Plantilla de función

Es habitual utilizar los mismos gráficos una y otra vez, pero con diferentes conjuntos de datos, lo que lleva a la necesidad de escribir funciones especializadas que permitan reutilizar código y ahorren trabajo.

python
def plot_function(ax, data1, data2, param_dict):
    
    """
    Una función de ayuda para hacer un gráfico con matplotlib.pyplot
    
    Parámetros
    ------------------------
    ax: Axes
        Los ejes sobre los cuales dibujar
    
    data1: array
        Un primer vector de datos (x)
        
    data2: array
        Un segundo vector de datos (y)
    
    param_dict: dict
        Diccionario de parámetros para pasarle a ax.plot
        
    Devuelve
    -------------------------
    out: list
        Lista de objetos de tipo "artist" añadidos
        
    """
    
    out = ax.plot(data1, data2, **param_dict)
    return out
python
fig, ax = plt.subplots(1,1)
data_a = [1,2,3,4]
data_b = [2,3,4,5]
par_dict = {"marker": "o", "color": "green", "markersize": 12}

plot_function(ax = ax, data1 = data_a, data2 = data_b, param_dict = par_dict)
[<matplotlib.lines.Line2D at 0x97f5d60>]

png

python
fig, ax = plt.subplots(1,1)
par_dict = {"marker": "o", "color": "green", "markersize": 12}
data_c = [10,20,30,40]
data_d = [100,200,300,400]
plot_function(ax = ax, data1 = data_c, data2 = data_d, param_dict = par_dict)
[<matplotlib.lines.Line2D at 0xa7b0eb0>]

png

python
fig, (ax1, ax2) = plt.subplots(1, 2)
plot_function(ax = ax1, data1 = data_a, data2 = data_b, param_dict = {"marker": "x", "color": "red", "markersize": 6})
plot_function(ax = ax2, data1 = data_c, data2 = data_d, param_dict = {"marker": "o", "color": "green", "markersize": 12})
[<matplotlib.lines.Line2D at 0xa372c70>]

png

comments powered by Disqus