Transparencia de imágenes con Matplotlib

Beginner

This tutorial is from open-source community. Access the source code

Introducción

Esta práctica te mostrará cómo combinar transparencia con color en imágenes 2D utilizando Matplotlib. El objetivo es resaltar ciertas partes de los datos con imshow.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haz clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tengas que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tienes problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona retroalimentación después de la sesión y resolveremos rápidamente el problema para ti.

Generar datos

Comenzaremos generando dos manchas bidimensionales en una cuadrícula 2D. Una mancha será positiva y la otra negativa.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import Normalize

def normal_pdf(x, mean, var):
    return np.exp(-(x - mean)**2 / (2*var))

## Generar el espacio en el que vivirán las manchas
xmin, xmax, ymin, ymax = (0, 100, 0, 100)
n_bins = 100
xx = np.linspace(xmin, xmax, n_bins)
yy = np.linspace(ymin, ymax, n_bins)

## Generar las manchas. El rango de los valores es aproximadamente de -.0002 a.0002
means_high = [20, 50]
means_low = [50, 60]
var = [150, 200]

gauss_x_high = normal_pdf(xx, means_high[0], var[0])
gauss_y_high = normal_pdf(yy, means_high[1], var[0])

gauss_x_low = normal_pdf(xx, means_low[0], var[1])
gauss_y_low = normal_pdf(yy, means_low[1], var[1])

weights = (np.outer(gauss_y_high, gauss_x_high)
           - np.outer(gauss_y_low, gauss_x_low))

## También crearemos un fondo gris en el que los píxeles se desvanecerán
greys = np.full((*weights.shape, 3), 70, dtype=np.uint8)

Graficar las manchas

A continuación, graficaremos estas manchas utilizando imshow sin transparencia.

vmax = np.abs(weights).max()
imshow_kwargs = {
    'vmax': vmax,
    'vmin': -vmax,
    'cmap': 'RdYlBu',
    'extent': (xmin, xmax, ymin, ymax),
}

fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, **imshow_kwargs)
ax.set_axis_off()
plt.show()

Combinar transparencia

La forma más simple de incluir transparencia al graficar datos con imshow es pasar una matriz con la misma forma que los datos al argumento alpha.

## Crear una canal alfa con valores que aumentan linealmente hacia la derecha.
alphas = np.ones(weights.shape)
alphas[:, 30:] = np.linspace(1, 0, 70)

## Crear la figura y la imagen
fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, alpha=alphas, **imshow_kwargs)
ax.set_axis_off()
plt.show()

Utilizar la transparencia para resaltar valores

Finalmente, recrearemos la misma gráfica, pero esta vez usaremos la transparencia para resaltar los valores extremos en los datos. Esto se suele utilizar para resaltar puntos de datos con valores p más pequeños. También agregaremos líneas de contorno para resaltar los valores de la imagen.

## Crear un canal alfa basado en los valores de peso
alphas = Normalize(0,.3, clip=True)(np.abs(weights))
alphas = np.clip(alphas,.4, 1)  ## el valor de alfa se recorta en la parte inferior en.4

## Crear la figura y la imagen
fig, ax = plt.subplots()
ax.imshow(greys)
ax.imshow(weights, alpha=alphas, **imshow_kwargs)

## Agregar líneas de contorno para resaltar aún más diferentes niveles.
ax.contour(weights[::-1], levels=[-.1,.1], colors='k', linestyles='-')
ax.set_axis_off()
plt.show()

ax.contour(weights[::-1], levels=[-.0001,.0001], colors='k', linestyles='-')
ax.set_axis_off()
plt.show()

Resumen

En este laboratorio, aprendimos cómo combinar la transparencia con el color en imágenes 2D utilizando Matplotlib. También aprendimos cómo resaltar ciertas partes de los datos con imshow.