Una breve introducción a matplotlib para visualización de datos

U

Introducción

Python tiene una amplia variedad de paquetes útiles para el Machine Learning y el análisis estadístico, como TensorFlow, NumPy, scikit-learn, Pandas, y más. Un paquete que es esencial para la mayoría de los proyectos de ciencia de datos es matplotlib.

Disponible para cualquier distribución de Python, se puede instalar en Python 3 con pip. También hay otros métodos disponibles, consulte https://matplotlib.org/ para más detalles.

Instalación

Si usa un sistema operativo con una terminal, el siguiente comando instalaría matplotlib con pip:

$ python3 -m pip install matplotlib

Importación y medio ambiente

En un archivo de Python, queremos importar el pyplot función que nos permite interactuar con un entorno de trazado similar a MATLAB. También importamos un lines función que nos permite agregar líneas a los gráficos:

import matplotlib.pyplot as plt
import matplotlib.lines as mlines

Básicamente, este entorno de trazado nos permite guardar figuras y sus atributos como variables. Estos gráficos se pueden imprimir y visualizar con un simple comando. Por ejemplo, podemos ver el precio de las acciones de Google: específicamente la fecha, apertura, cierre, volumen y precio de cierre ajustado (la fecha se almacena como un np.datetime64) durante los 250 días más recientes:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook

with cbook.get_sample_data('goog.npz') as datafile:
    price_data = np.load(datafile)['price_data'].view(np.recarray)
price_data = price_data[-250:] # get the most recent 250 trading days

Luego transformamos los datos de una manera que se hace con bastante frecuencia para series de tiempo, etc. Encontramos la diferencia, $d_i$, entre cada observación y la anterior:

$$d_i = y_i - y_{i - 1} $$

delta1 = np.diff(price_data.adj_close) / price_data.adj_close[:-1]

También podemos observar las transformaciones de diferentes variables, como el volumen y el precio de cierre:

# Marker size in units of points^2
volume = (15 * price_data.volume[:-2] / price_data.volume[0])**2
close = 0.003 * price_data.close[:-2] / 0.003 * price_data.open[:-2]

Trazar un diagrama de dispersión

Para trazar realmente estos datos, puede utilizar el subplots() funciones de plt (matplotlib.pyplot). De forma predeterminada, esto genera el área para la figura y los ejes de un gráfico.

Aquí haremos un diagrama de dispersión de las diferencias entre días sucesivos. Para elaborar, x es la diferencia entre el día i y el día anterior. y es la diferencia entre el día i + 1 y el día anterior (i):

fig, ax = plt.subplots()
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5)

ax.set_xlabel(r'$Delta_i$', fontsize=15)
ax.set_ylabel(r'$Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and percent change')

ax.grid(True)
fig.tight_layout()

plt.show()

Luego creamos etiquetas para los ejes xey, así como un título para el gráfico. Elegimos trazar estos datos con cuadrículas y un diseño ajustado.

plt.show() muestra la trama para nosotros.

Agregar una línea

Podemos agregar una línea a esta gráfica proporcionando las coordenadas xey como listas a un Line2D ejemplo:

import matplotlib.lines as mlines

fig, ax = plt.subplots()
line = mlines.Line2D([-.15,0.25], [-.07,0.09], color="red")
ax.add_line(line)

# reusing scatterplot code
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5)

ax.set_xlabel(r'$Delta_i$', fontsize=15)
ax.set_ylabel(r'$Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and percent change')

ax.grid(True)
fig.tight_layout()

plt.show()

Trazado de histogramas

Para trazar un histograma, seguimos un proceso similar y usamos el hist() función de pyplot. Generaremos 10000 puntos de datos aleatorios, x, con una media de 100 y una desviación estándar de 15.

los hist La función toma los datos, x, el número de bins y otros argumentos como la densidad, que normaliza los datos a una densidad de probabilidad, o alfa, que establece la transparencia del histograma.

También usaremos la biblioteca mlab para agregar una línea que represente una función de densidad normal con la misma desviación estándar y media:

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma*np.random.randn(10000)

# the histogram of the data
n, bins, patches = plt.hist(x, 30, density=1, facecolor="blue", alpha=0.75)

# add a 'best fit' line
y = mlab.normpdf( bins, mu, sigma)
l = plt.plot(bins, y, 'r--', linewidth=4)

plt.xlabel('IQ')
plt.ylabel('Probability')
plt.title(r'$mathrm{Histogram of IQ:} mu=100, sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)

plt.show()

Gráfica de barras

Mientras que los histogramas nos ayudaron con las densidades visuales, los gráficos de barras nos ayudan a ver los recuentos de datos. Para trazar un gráfico de barras con matplotlib, usamos el bar() función. Esto toma los conteos y etiquetas de datos como xey, junto con otros argumentos.

Como ejemplo, podríamos ver una muestra de la cantidad de programadores que usan diferentes lenguajes:

import numpy as np
import matplotlib.pyplot as plt
 
objects = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))
performance = [10,8,6,4,2,1]
 
plt.bar(y_pos, performance, align='center', alpha=0.5)
plt.xticks(y_pos, objects)
plt.ylabel('Usage')
plt.title('Programming language usage')
 
plt.show()

Trazado de imágenes

El análisis de imágenes es muy común en Python. No es sorprendente que podamos usar matplotlib para ver imágenes. Usamos el cv2 biblioteca para leer en imágenes.

los read_image() el resumen de la función está a continuación:

  • lee el archivo de imagen
  • divide los canales de color
  • los cambia a RGB
  • cambia el tamaño de la imagen
  • devuelve una matriz de valores RGB

El resto del código se lee en las primeras cinco imágenes de gatos y perros a partir de los datos utilizados en una CNN de reconocimiento de imágenes. Las imágenes se concatenan e imprimen en el mismo eje:

import matplotlib.pyplot as plt
import numpy as np
import os, cv2

cwd = os.getcwd()
TRAIN_DIR = cwd + '/data/train/'

ROWS = 256
COLS = 256
CHANNELS = 3

train_images = [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR)] # use this for full dataset
train_dogs =   [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR) if 'dog' in i]
train_cats =   [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR) if 'cat' in i]

def read_image(file_path):
    img = cv2.imread(file_path, cv2.IMREAD_COLOR) #cv2.IMREAD_GRAYSCALE
    b,g,r = cv2.split(img)
    img2 = cv2.merge([r,g,b])
    return cv2.resize(img2, (ROWS, COLS), interpolation=cv2.INTER_CUBIC)

for a in range(0,5):
    cat = read_image(train_cats[a])
    dog = read_image(train_dogs[a])
    pair = np.concatenate((cat, dog), axis=1)
    plt.figure(figsize=(10,5))
    plt.imshow(pair)
    plt.show()

Conclusión

En esta publicación, vimos una breve introducción sobre cómo usar matplotlib para trazar datos en diagramas de dispersión, histogramas y gráficos de barras. También agregamos líneas a estos gráficos. Finalmente, vimos cómo leer imágenes usando la biblioteca cv2 y usamos matplotlib para trazar las imágenes.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad