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

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *