Superponer una imagen en un gráfico de Matplotlib

MatplotlibMatplotlibBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En la visualización de datos, a veces es posible que desees agregar un logotipo, una marca de agua u otros elementos de imagen a tus gráficos. Este tutorial demuestra cómo superponer una imagen en un gráfico de Matplotlib colocándola delante del contenido del gráfico y haciéndola semitransparente.

Aprenderás cómo utilizar el método figimage de la clase matplotlib.figure.Figure para posicionar una imagen en tu gráfico, y el método imread del módulo matplotlib.image para cargar los datos de la imagen.

Al final de este tutorial, serás capaz de crear visualizaciones de aspecto profesional con superposiciones de imágenes personalizadas que pueden ser útiles para la marca, la marca de agua o mejorar el atractivo visual de tus presentaciones de datos.

Consejos para la MV

Después de que la máquina virtual (VM) haya terminado de iniciarse, haz clic en la esquina superior izquierda para cambiar a la pestaña Notebook y acceder a Jupyter Notebook para practicar.

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) matplotlib(("Matplotlib")) -.-> matplotlib/PlottingDataGroup(["Plotting Data"]) matplotlib(("Matplotlib")) -.-> matplotlib/PlotCustomizationGroup(["Plot Customization"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") matplotlib/PlottingDataGroup -.-> matplotlib/line_plots("Line Plots") matplotlib/PlottingDataGroup -.-> matplotlib/scatter_plots("Scatter Plots") matplotlib/PlottingDataGroup -.-> matplotlib/bar_charts("Bar Charts") matplotlib/PlotCustomizationGroup -.-> matplotlib/titles_labels("Adding Titles and Labels") matplotlib/PlotCustomizationGroup -.-> matplotlib/axis_ticks("Axis Ticks Customization") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-49029{{"Superponer una imagen en un gráfico de Matplotlib"}} matplotlib/figures_axes -.-> lab-49029{{"Superponer una imagen en un gráfico de Matplotlib"}} matplotlib/line_plots -.-> lab-49029{{"Superponer una imagen en un gráfico de Matplotlib"}} matplotlib/scatter_plots -.-> lab-49029{{"Superponer una imagen en un gráfico de Matplotlib"}} matplotlib/bar_charts -.-> lab-49029{{"Superponer una imagen en un gráfico de Matplotlib"}} matplotlib/titles_labels -.-> lab-49029{{"Superponer una imagen en un gráfico de Matplotlib"}} matplotlib/axis_ticks -.-> lab-49029{{"Superponer una imagen en un gráfico de Matplotlib"}} end

Creación de un Jupyter Notebook e Importación de las Bibliotecas Requeridas

En la primera celda de tu cuaderno (notebook), introduce el siguiente código para importar las bibliotecas necesarias:

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

Vamos a entender qué hace cada una de estas bibliotecas:

  • matplotlib.pyplot (con alias plt): Una colección de funciones que hace que matplotlib funcione como MATLAB, proporcionando una interfaz conveniente para crear gráficos.
  • numpy (con alias np): Un paquete fundamental para la computación científica en Python, que usaremos para la manipulación de datos.
  • matplotlib.cbook: Una colección de funciones de utilidad para matplotlib, incluyendo funciones para obtener datos de muestra.
  • matplotlib.image: Un módulo para la funcionalidad relacionada con imágenes en matplotlib, que usaremos para leer y mostrar imágenes.

Ejecuta la celda haciendo clic en el botón "Run" en la parte superior del cuaderno o presionando Shift+Enter.

libraries-imported

La ejecución de esta celda debe completarse sin ningún resultado, lo que indica que todas las bibliotecas se importaron correctamente.

Carga y Examen de la Imagen

Ahora que hemos importado nuestras bibliotecas, necesitamos cargar la imagen que queremos superponer en nuestro gráfico. Matplotlib proporciona algunas imágenes de muestra que podemos utilizar para practicar.

  1. Crea una nueva celda en tu cuaderno (notebook) e introduce el siguiente código:
## Load the sample image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Display information about the image
print(f"Image shape: {im.shape}")
print(f"Image data type: {im.dtype}")

## Display the image
plt.figure(figsize=(4, 4))
plt.imshow(im)
plt.axis('off')  ## Hide axis
plt.title('Matplotlib Logo')
plt.show()

Este código hace lo siguiente:

  • Utiliza cbook.get_sample_data() para cargar una imagen de muestra llamada 'logo2.png' de la colección de datos de muestra de Matplotlib.
  • Utiliza image.imread() para leer el archivo de imagen en una matriz NumPy.
  • Imprime información sobre las dimensiones y el tipo de datos de la imagen.
  • Crea una figura y muestra la imagen utilizando plt.imshow().
  • Oculta las marcas y etiquetas del eje con plt.axis('off').
  • Agrega un título a la figura.
  • Muestra la figura utilizando plt.show().
  1. Ejecuta la celda presionando Shift+Enter.

La salida debe mostrar información sobre la imagen y mostrar el logotipo de Matplotlib. La forma de la imagen indica las dimensiones de la misma (altura, ancho, canales de color), y el tipo de datos nos dice cómo se almacenan los datos de la imagen.

image-info

Este paso es importante porque nos ayuda a entender la imagen que usaremos como superposición. Podemos ver su apariencia y dimensiones, lo cual será útil a la hora de decidir cómo posicionarla en nuestro gráfico.

Creación de un Gráfico Básico con Datos Aleatorios

Antes de agregar la superposición de la imagen, necesitamos crear un gráfico que servirá como base para nuestra visualización. Vamos a crear un simple gráfico de barras utilizando datos aleatorios.

  1. Crea una nueva celda en tu cuaderno (notebook) e introduce el siguiente código:
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)  ## x-axis values (0 to 29)
y = x + np.random.randn(30)  ## y-axis values (x plus random noise)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')  ## Green bars

## Add grid lines
ax.grid(linestyle='--', alpha=0.7)

## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Random Data')

## Display the plot
plt.tight_layout()
plt.show()

Este código hace lo siguiente:

  • Crea una figura y ejes con un tamaño específico utilizando plt.subplots().
  • Establece una semilla aleatoria para garantizar que obtengamos los mismos valores aleatorios cada vez que ejecutamos el código.
  • Genera 30 valores en el eje x (desde 0 hasta 29) y los correspondientes valores en el eje y (x más ruido aleatorio).
  • Crea un gráfico de barras con barras verdes utilizando ax.bar().
  • Agrega líneas de cuadrícula al gráfico con ax.grid().
  • Agrega etiquetas para el eje x, el eje y y un título para el gráfico.
  • Utiliza plt.tight_layout() para ajustar el espaciado y mejorar la apariencia.
  • Muestra el gráfico utilizando plt.show().
  1. Ejecuta la celda presionando Shift+Enter.

La salida debe mostrar un gráfico de barras con barras verdes que representan los datos aleatorios. El eje x muestra enteros del 0 al 29, y el eje y muestra los valores correspondientes con ruido aleatorio agregado.

Este gráfico será la base sobre la cual superpondremos nuestra imagen en el siguiente paso. Observa cómo hemos almacenado el objeto de la figura en la variable fig y el objeto de los ejes en la variable ax. Necesitaremos estas variables para agregar la superposición de la imagen.

Superposición de la Imagen en el Gráfico

Ahora que hemos creado nuestro gráfico base, vamos a superponer la imagen sobre él. Utilizaremos el método figimage para agregar la imagen a la figura, y la haremos semi-transparente para que el gráfico debajo siga siendo visible.

  1. Crea una nueva celda en tu cuaderno (notebook) e introduce el siguiente código:
## Create a figure and axes for our plot (same as before)
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)  ## x-axis values (0 to 29)
y = x + np.random.randn(30)  ## y-axis values (x plus random noise)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')  ## Green bars

## Add grid lines
ax.grid(linestyle='--', alpha=0.7)

## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Image Overlay')

## Load the image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Overlay the image on the plot
## Parameters:
## - im: the image data
## - 25, 25: x and y position in pixels from the bottom left
## - zorder=3: controls the drawing order (higher numbers are drawn on top)
## - alpha=0.5: controls the transparency (0 = transparent, 1 = opaque)
fig.figimage(im, 25, 25, zorder=3, alpha=0.5)

## Display the plot
plt.tight_layout()
plt.show()

Este código combina lo que hicimos en los pasos anteriores y agrega el método figimage para superponer nuestra imagen en el gráfico. Aquí está un desglose de los parámetros de figimage:

  • im: Los datos de la imagen como una matriz NumPy.
  • 25, 25: Las posiciones x e y en píxeles desde la esquina inferior izquierda de la figura.
  • zorder=3: Controla el orden de dibujo. Los números más altos se dibujan encima de los elementos con números más bajos.
  • alpha=0.5: Controla la transparencia de la imagen. Un valor de 0 es completamente transparente, y 1 es completamente opaco.
  1. Ejecuta la celda presionando Shift+Enter.

La salida debe mostrar el mismo gráfico de barras que antes, pero ahora con el logotipo de Matplotlib superpuesto en la esquina inferior izquierda. El logotipo debe ser semi-transparente, permitiendo que el gráfico debajo siga siendo visible.

  1. Vamos a experimentar con diferentes posiciones y niveles de transparencia. Crea una nueva celda e introduce el siguiente código:
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)
y = x + np.random.randn(30)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Centered Image Overlay')

## Load the image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Get figure dimensions
fig_width, fig_height = fig.get_size_inches() * fig.dpi

## Calculate center position (this is approximate)
x_center = fig_width / 2 - im.shape[1] / 2
y_center = fig_height / 2 - im.shape[0] / 2

## Overlay the image at the center with higher transparency
fig.figimage(im, x_center, y_center, zorder=3, alpha=0.3)

## Display the plot
plt.tight_layout()
plt.show()

Este código coloca la imagen en el centro de la figura con un nivel de transparencia más alto (alpha = 0.3), lo que la hace más adecuada como marca de agua.

  1. Ejecuta la celda presionando Shift+Enter.

La salida debe mostrar el gráfico de barras con el logotipo centrado y más transparente que antes, creando un efecto de marca de agua.

Creación de una Función Reutilizable para Superposiciones de Imágenes

Para hacer nuestro código más reutilizable, vamos a crear una función que pueda agregar una superposición de imagen a cualquier figura de Matplotlib. De esta manera, podemos aplicar fácilmente el mismo efecto a diferentes gráficos.

  1. Crea una nueva celda en tu cuaderno (notebook) e introduce el siguiente código:
def add_image_overlay(fig, image_path, x_pos=25, y_pos=25, alpha=0.5, zorder=3):
    """
    Add an image overlay to a matplotlib figure.

    Parameters:
    -----------
    fig : matplotlib.figure.Figure
        The figure to add the image to
    image_path : str
        Path to the image file
    x_pos : int
        X position in pixels from the bottom left
    y_pos : int
        Y position in pixels from the bottom left
    alpha : float
        Transparency level (0 to 1)
    zorder : int
        Drawing order (higher numbers are drawn on top)

    Returns:
    --------
    fig : matplotlib.figure.Figure
        The figure with the image overlay
    """
    ## Load the image
    with cbook.get_sample_data(image_path) as file:
        im = image.imread(file)

    ## Add the image to the figure
    fig.figimage(im, x_pos, y_pos, zorder=zorder, alpha=alpha)

    return fig

## Example usage: Create a scatter plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data for a scatter plot
x = np.random.rand(50) * 10
y = np.random.rand(50) * 10

## Create a scatter plot
ax.scatter(x, y, s=100, c=np.random.rand(50), cmap='viridis', alpha=0.7)
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Scatter Plot with Image Overlay')

## Add the image overlay using our function
add_image_overlay(fig, 'logo2.png', x_pos=50, y_pos=50, alpha=0.4)

## Display the plot
plt.tight_layout()
plt.show()

Este código define una función llamada add_image_overlay que:

  • Toma parámetros para la figura, la ruta de la imagen, la posición, la transparencia y el orden de dibujo (z-order).
  • Carga la imagen especificada.
  • Agrega la imagen a la figura utilizando figimage.
  • Devuelve la figura modificada.

Después de definir la función, demostramos su uso creando un gráfico de dispersión con datos aleatorios y agregando el logotipo de Matplotlib como superposición.

  1. Ejecuta la celda presionando Shift+Enter.

La salida debe mostrar un gráfico de dispersión con puntos de posición y color aleatorios, y el logotipo de Matplotlib superpuesto en la posición (50, 50) con una opacidad del 40%.

  1. Vamos a probar otro ejemplo con un gráfico de línea. Crea una nueva celda e introduce el siguiente código:
## Example usage: Create a line plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))

## Generate data for a line plot
x = np.linspace(0, 10, 100)
y = np.sin(x)

## Create a line plot
ax.plot(x, y, linewidth=2, color='#d62728')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Sine Wave with Image Overlay')
ax.set_ylim(-1.5, 1.5)

## Add the image overlay using our function
## Place it in the bottom right corner
fig_width, fig_height = fig.get_size_inches() * fig.dpi
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)
    x_pos = fig_width - im.shape[1] - 50  ## 50 pixels from the right edge

add_image_overlay(fig, 'logo2.png', x_pos=x_pos, y_pos=50, alpha=0.6)

## Display the plot
plt.tight_layout()
plt.show()

Este código crea un gráfico de línea que muestra una onda sinusoidal y agrega el logotipo de Matplotlib en la esquina inferior derecha del gráfico.

  1. Ejecuta la celda presionando Shift+Enter.

La salida debe mostrar un gráfico de línea de una onda sinusoidal con el logotipo de Matplotlib superpuesto en la esquina inferior derecha con una opacidad del 60%.

Estos ejemplos demuestran cómo nuestra función add_image_overlay se puede utilizar para agregar fácilmente superposiciones de imágenes a diferentes tipos de gráficos, lo que la convierte en una herramienta versátil para personalizar visualizaciones.

Resumen

En este tutorial, aprendiste cómo superponer imágenes en gráficos de Matplotlib para crear marcas de agua, logotipos u otros elementos visuales que mejoren tus visualizaciones. Aquí está un resumen de lo que cubrimos:

  1. Importación de Bibliotecas: Comenzamos importando las bibliotecas necesarias para trabajar con gráficos y imágenes de Matplotlib.

  2. Carga y Examen de Imágenes: Aprendimos cómo cargar imágenes utilizando la función imread y cómo inspeccionar sus propiedades.

  3. Creación de Gráficos Base: Creamos diferentes tipos de gráficos (gráficos de barras, gráficos de dispersión y gráficos de línea) para servir como base para nuestras superposiciones de imágenes.

  4. Superposición de Imágenes: Utilizamos el método figimage para colocar imágenes en nuestros gráficos, controlando su posición, transparencia y orden de dibujo.

  5. Creación de una Función Reutilizable: Desarrollamos una función reutilizable para facilitar la adición de superposiciones de imágenes a cualquier figura de Matplotlib.

Las habilidades que aprendiste en este tutorial se pueden aplicar a:

  • Agregar marcas de agua a los gráficos para protección de derechos de autor.
  • Incluir logotipos para la marca en las visualizaciones.
  • Crear elementos de fondo personalizados para gráficos estéticamente atractivos.
  • Combinar imágenes con visualizaciones de datos para presentaciones e informes.

Puedes continuar experimentando con diferentes tipos de gráficos, imágenes, posiciones y niveles de transparencia para crear visualizaciones únicas y de aspecto profesional que cumplan con tus necesidades específicas.