Introducción
La visualización como herramienta toma parte del análisis proveniente del científico de datos para extraer conclusiones de un conjunto de datos. En el artículo de hoy vamos a pasar por la librería Matplotlib. Matplotlib es una librería de terceros para la visualización de datos. Funciona bien en combinación con NumPy, SciPy y Pandas.
Plot básico, visualización de funciones y visualización de datos
The 2009 data set ‘Wine Quality Dataset’ elaborated by Cortez et al. available at UCI Machine Learning, is a well-known dataset that contains wine quality information.It includes data about red and white wine physicochemical properties and a quality score. Before we start, we are going to visualize the head a little example dataset:
Plot básico
Matplotlib es una librería que tiene un poder infinito para representar datos de casi cualquier forma posible. Para entender cómo funciona, vamos a empezar con las instrucciones más básicas y poco a poco vamos a aumentar la dificultad.
La forma más útil de comprobar la distribución de los datos es representándola, así que vamos a empezar pintando una serie de puntos. Para ello, podemos utilizar tanto plt.plot como plt.scatter para visualizarlos.
Lista de distribución de puntos de plot
Import matplotlib as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
plt.axis([0, 6, 0, 21])
Representación de una lista de puntos mediante la función `plot`:
Fig 1. Trazado de la lista de puntos utilizando plt.plot y plt.scatter plot. La diferencia entre ambos viene con el control sobre el color, la forma y el tamaño de los puntos. En plt.scatter tienes más control en la apariencia de cada punto.
Import matplotlib as plt
plt.scatter([1, 2, 3, 4], [1, 4, 9, 16])
plt.axis([0, 6, 0, 21])
Representación de una lista de puntos mediante la función `scatter`:
points = [[1,2,3,4], [1,4,9,16]]
plt.plot(points[0], points[1], 'g^')
plt.plot([x * 2 for x in points[0]], points[1], 'r--')
plt.plot([x * 2.3 for x in points[0]], points[1], 'bs')
plt.axis([0, 15, 0, 21])
Fig. 2. Gráfico de 3 listas de puntos diferentes. La función de gráfico de dispersión permite personalizar la forma de los diferentes puntos
Visualización de funciones
A veces queremos pintar una serie de puntos basándonos en el comportamiento de una determinada función. Para ilustrar este ejemplo vamos a utilizar la función seno(2πx). Como verás, vamos a definir previamente la función por lo que podríamos utilizar cualquier función que creemos, no tiene por qué estar predeterminada.
Representando una función:
Import matplotlib as plt
Import numpy as np
def sin(t):
return np.sin(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
plt.scatter(t1, sin(t1))
Fig. 3. Representación de una función con puntos y líneas utilizando las funciones de gráfico de dispersión y gráfico de la biblioteca matplotlib
Ahora haremos la misma representación pero utilizando una línea que pasa por todos estos puntos.
Import matplotlib as plt
Import numpy as np
def sin(t):
return np.sin(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
plt.plot(t1, sin(t1), 'b')
Visualización de datos
Vamos a empezar con algunas visualizaciones básicas pero muy útiles cuando empezamos a estudiar nuestros datos. Para ello vamos a utilizar el conjunto de datos de vino de calidad comentado anteriormente y vamos a aprender a representar un histograma de datos y una comparación entre dos columnas.
Representación de un histograma de una columna de nuestro conjunto de datos:
df_wine['fixed acidity'].hist(legend=True)
Fig 4
Comparación de dos columnas del conjunto de datos:
plt.figure(figsize=(7, 4))
plt.plot(df_wine['fixed acidity'], df_wine['quality'], 'ro')
plt.xlabel('quality')
plt.ylabel('fixed acidity')
Fig 5
Representación de un histograma de una columna de nuestro conjunto de datos:
plt.bar(df_wine['quality'], df_wine['fixed acidity'])
plt.xlabel('Quality')
plt.ylabel('Fixed Acidity')
Fig 6
Ahora vamos a subir un poco la dificultad y vamos a entrar en lo que Matplotlib llama Figures.
Matplotlib grafica tus datos en Figures (es decir, ventanas, widgets de Jupyter, etc.), cada una de las cuales puede contener uno o más ejes (es decir, un área donde los puntos pueden especificarse en términos de coordenadas x-y, o theta-r en un gráfico polar, o x-y-z en un gráfico 3D, etc.).
La forma más sencilla de crear una figura con un eje es utilizando pyplot.subplots. Luego podemos usar Axes.plot para dibujar algunos datos en los ejes:
Fig 7
Vamos a empezar creando una figura vacía y vamos a añadirle un título.
Figura vacía con el título «This is an empty figure»:
fig = plt.figure()
fig.suptitle('This is an empty figure', fontsize=14, fontweight='bold')
ax = fig.add_subplot(111)
plt.show()
Como puedes ver `fig.add_subplot(111)` son parámetros del grid del subplot codificados como un solo entero.
Por ejemplo, «111» significa «cuadrícula 1×1, 1er subplot» y «234» significa «cuadrícula 2×3, 4to subplot».
La forma alternativa de add_subplot(111) es add_subplot(1, 1, 1)
A continuación escribiremos el nombre de lo que representa cada eje y añadiremos un pequeño cuadro de texto.
Trazar un texto dentro de una caja:
fig = plt.figure()
fig.suptitle('This is an empty figure', fontsize=14, fontweight='bold')
ax = fig.add_subplot(111)
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
ax.text(0.3, 0.8, 'boxed italics text in data coords', style='italic',
bbox={'facecolor':'red', 'alpha':0.5, 'pad':10})
plt.show()
Ahora vamos a intentar escribir una anotación seguida de una flecha.
Traza una anotación:
fig = plt.figure()
fig.suptitle('This is an empty figure', fontsize=14, fontweight='bold')
ax = fig.add_subplot(111)
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
ax.annotate('annotate', xy=(0.2, 0.1), xytext=(0.3, 0.4),
arrowprops=dict(facecolor='black', shrink=0.05))
plt.show()
Por último, algo muy útil que solemos necesitar es configurar el rango de los ejes para nuestra representación. Para ello vamos a utilizar el atributo axis y pasarle los valores que queramos configurar.
Cambia los rangos de los ejes a x -> [0, 10] y -> [0, 10]:
fig = plt.figure()
fig.suptitle('This is an empty figure', fontsize=14, fontweight='bold')
ax = fig.add_subplot(111)
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
ax.axis([0, 10, 0, 10])
Entrenando tus habilidades
Si quieres llevar tus habilidades un nivel más allá en Ciencia de Datos, hemos creado un curso que puedes descargar gratuitamente aquí.