Introducción
Contenido
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:
Te puede interesar:Creación de una red neuronal desde cero en Python: Clasificación multiclase$ 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:
Te puede interesar:Uso del Machine Learning para predecir el tiempo: Parte 3import 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.