Colocación de cajas de texto en 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

Al crear visualizaciones de datos, agregar anotaciones puede mejorar en gran medida la comprensión del espectador de sus gráficos. Las cajas de texto son una forma efectiva de incluir información adicional directamente dentro de sus visualizaciones. Matplotlib, una popular biblioteca de Python para crear visualizaciones estáticas, animadas e interactivas, ofrece herramientas poderosas para agregar cajas de texto personalizables a sus gráficos.

En este laboratorio, aprenderá cómo colocar cajas de texto en gráficos de Matplotlib utilizando Python. Descubrirá cómo posicionar texto en coordenadas de ejes, lo que mantiene el texto en una posición fija en relación con el gráfico, independientemente de los cambios en las escalas de los datos. Además, aprenderá cómo personalizar las cajas de texto con diferentes estilos, colores y niveles de transparencia utilizando la propiedad bbox.

Al final de este laboratorio, podrá crear gráficos informativos y visualmente atractivos con anotaciones estratégicamente colocadas para sus proyectos de visualización de datos.

Consejos de la MV

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

click-notebook

Es posible que deba esperar unos segundos para que Jupyter Notebook termine de cargar. Debido a las limitaciones de Jupyter Notebook, la validación de las operaciones no se puede automatizar.

Si encuentra algún problema durante el laboratorio, no dude en pedir ayuda a Labby. Agradecemos sus comentarios después de la sesión para ayudarnos a mejorar la experiencia del laboratorio.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL matplotlib(("Matplotlib")) -.-> matplotlib/PlotCustomizationGroup(["Plot Customization"]) matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) matplotlib(("Matplotlib")) -.-> matplotlib/PlottingDataGroup(["Plotting Data"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") matplotlib/PlottingDataGroup -.-> matplotlib/histograms("Histograms") matplotlib/PlotCustomizationGroup -.-> matplotlib/titles_labels("Adding Titles and Labels") matplotlib/PlotCustomizationGroup -.-> matplotlib/text_annotations("Text Annotations") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-48868{{"Colocación de cajas de texto en Matplotlib"}} matplotlib/figures_axes -.-> lab-48868{{"Colocación de cajas de texto en Matplotlib"}} matplotlib/histograms -.-> lab-48868{{"Colocación de cajas de texto en Matplotlib"}} matplotlib/titles_labels -.-> lab-48868{{"Colocación de cajas de texto en Matplotlib"}} matplotlib/text_annotations -.-> lab-48868{{"Colocación de cajas de texto en Matplotlib"}} end

Creación de un Jupyter Notebook y preparación de los datos

En este primer paso, crearemos un nuevo Jupyter Notebook y prepararemos nuestros datos para la visualización.

Creación de un nuevo cuaderno

En la primera celda del cuaderno, importemos las bibliotecas necesarias. Escriba el siguiente código y ejecútelo haciendo clic en el botón "Run" o presionando Shift+Enter:

import matplotlib.pyplot as plt
import numpy as np
libraries-imported

Este código importa dos bibliotecas esenciales:

  • matplotlib.pyplot: Una colección de funciones que hace que matplotlib funcione como MATLAB
  • numpy: Un paquete fundamental para la computación científica en Python

Creación de datos de muestra

Ahora, creemos algunos datos de muestra que visualizaremos. En una nueva celda, ingrese y ejecute el siguiente código:

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

## Generate 10,000 random numbers from a normal distribution
x = 30 * np.random.randn(10000)

## Calculate basic statistics
mu = x.mean()
median = np.median(x)
sigma = x.std()

## Display the statistics
print(f"Mean (μ): {mu:.2f}")
print(f"Median: {median:.2f}")
print(f"Standard Deviation (σ): {sigma:.2f}")

Cuando ejecute esta celda, debería ver una salida similar a la siguiente:

Mean (μ): -0.31
Median: -0.28
Standard Deviation (σ): 29.86

Los valores exactos pueden variar ligeramente. Hemos creado un conjunto de datos con 10,000 números aleatorios generados a partir de una distribución normal y calculado tres estadísticas importantes:

  1. Media (μ): El valor promedio de todos los puntos de datos
  2. Mediana: El valor central cuando los datos se ordenan
  3. Desviación estándar (σ): Una medida de qué tan dispersos están los datos

Estas estadísticas se utilizarán más adelante para anotar nuestra visualización.

Creación de un histograma básico

Ahora que tenemos nuestros datos, creemos un histograma para visualizar su distribución. Un histograma divide los datos en intervalos (rangos) y muestra la frecuencia de los puntos de datos dentro de cada intervalo.

Creación del histograma

En una nueva celda de su Jupyter Notebook, ingrese y ejecute el siguiente código:

## Create a figure and axes
fig, ax = plt.subplots(figsize=(10, 6))

## Create a histogram with 50 bins
histogram = ax.hist(x, bins=50, color='skyblue', edgecolor='black')

## Add title and labels
ax.set_title('Distribution of Random Data', fontsize=16)
ax.set_xlabel('Value', fontsize=12)
ax.set_ylabel('Frequency', fontsize=12)

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

Cuando ejecute esta celda, debería ver un histograma que muestra la distribución de sus datos aleatorios. La salida se parecerá a una curva en forma de campana (distribución normal) centrada cerca de cero.

Comprensión del código

Analicemos lo que hace cada línea del código:

  1. fig, ax = plt.subplots(figsize=(10, 6)): Crea un objeto figura y ejes. El parámetro figsize establece el tamaño del gráfico en pulgadas (ancho, alto).

  2. histogram = ax.hist(x, bins=50, color='skyblue', edgecolor='black'): Crea un histograma de nuestros datos x con 50 intervalos. Los intervalos están coloreados de azul cielo con bordes negros.

  3. ax.set_title('Distribution of Random Data', fontsize=16): Agrega un título al gráfico con un tamaño de fuente de 16.

  4. ax.set_xlabel('Value', fontsize=12) y ax.set_ylabel('Frequency', fontsize=12): Agrega etiquetas a los ejes x e y con un tamaño de fuente de 12.

  5. plt.tight_layout(): Ajusta automáticamente el gráfico para que se ajuste al área de la figura.

  6. plt.show(): Muestra el gráfico.

El histograma muestra cómo se distribuyen nuestros datos. Dado que usamos np.random.randn(), que genera datos de una distribución normal, el histograma tiene forma de campana centrada en 0. La altura de cada barra representa cuántos puntos de datos caen dentro de ese rango.

Agregar una caja de texto con estadísticas

Ahora que tenemos un histograma básico, mejorémoslo agregando una caja de texto que muestre la información estadística sobre nuestros datos. Esto hará que la visualización sea más informativa para los espectadores.

Creación del contenido de texto

Primero, necesitamos preparar el contenido de texto que irá dentro de nuestra caja de texto. En una nueva celda, ingrese y ejecute el siguiente código:

## Create a string with the statistics
textstr = '\n'.join((
    r'$\mu=%.2f$' % (mu,),           ## Mean
    r'$\mathrm{median}=%.2f$' % (median,),  ## Median
    r'$\sigma=%.2f$' % (sigma,)       ## Standard deviation
))

print("Text content for our box:")
print(textstr)

Debería ver una salida similar a la siguiente:

Text content for our box:
$\mu=-0.31$
$\mathrm{median}=-0.28$
$\sigma=29.86$

Este código crea una cadena de varias líneas que contiene la media, la mediana y la desviación estándar de nuestros datos. Analicemos algunos aspectos interesantes de este código:

  1. El método \n'.join(...) une múltiples cadenas con un carácter de nueva línea entre ellas.
  2. La r antes de cada cadena la convierte en una cadena "cruda", lo cual es útil cuando se incluyen caracteres especiales.
  3. La notación $...$ se utiliza para el formato matemático en estilo LaTeX en matplotlib.
  4. \mu y \sigma son símbolos de LaTeX para las letras griegas μ (mu) y σ (sigma).
  5. %.2f es un especificador de formato que muestra un número de punto flotante con dos decimales.

Creación y adición de la caja de texto

Ahora, recreemos nuestro histograma y agreguemos la caja de texto a él. En una nueva celda, ingrese y ejecute el siguiente código:

## Create a new figure and axes
fig, ax = plt.subplots(figsize=(10, 6))

## Create a histogram with 50 bins
histogram = ax.hist(x, bins=50, color='skyblue', edgecolor='black')

## Add title and labels
ax.set_title('Distribution of Random Data with Statistics', fontsize=16)
ax.set_xlabel('Value', fontsize=12)
ax.set_ylabel('Frequency', fontsize=12)

## Define the properties of the text box
properties = dict(boxstyle='round', facecolor='wheat', alpha=0.5)

## Add the text box to the plot
## Position the box in the top left corner (0.05, 0.95) in axes coordinates
ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14,
        verticalalignment='top', bbox=properties)

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

Cuando ejecute esta celda, debería ver su histograma con una caja de texto en la esquina superior izquierda que muestra las estadísticas.

Comprensión del código de la caja de texto

Analicemos las partes importantes del código que crea la caja de texto:

  1. properties = dict(boxstyle='round', facecolor='wheat', alpha=0.5):

    • Esto crea un diccionario con propiedades para la caja de texto.
    • boxstyle='round': Hace que la caja tenga esquinas redondeadas.
    • facecolor='wheat': Establece el color de fondo de la caja en color trigo.
    • alpha=0.5: Hace que la caja sea semi-transparente (50% de opacidad).
  2. ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14, verticalalignment='top', bbox=properties):

    • Esto agrega texto a los ejes en la posición (0.05, 0.95).
    • transform=ax.transAxes: Esto es crucial, significa que las coordenadas están en unidades de ejes (0 - 1) en lugar de unidades de datos. Entonces, (0.05, 0.95) significa "5% desde el borde izquierdo y 95% desde el borde inferior del gráfico".
    • fontsize=14: Establece el tamaño de la fuente.
    • verticalalignment='top': Alinea el texto de modo que la parte superior del texto esté en la coordenada y especificada.
    • bbox=properties: Aplica nuestras propiedades de la caja de texto.

La caja de texto permanecerá en la misma posición en relación con los ejes del gráfico, incluso si se hace zoom en el gráfico o se cambia el rango de datos. Esto se debe a que usamos transform=ax.transAxes, que utiliza coordenadas de ejes en lugar de coordenadas de datos.

Personalización de la caja de texto

Ahora que hemos agregado con éxito una caja de texto a nuestro gráfico, exploremos varias opciones de personalización para hacerla más atractiva visualmente y adecuada para diferentes contextos.

Experimentar con diferentes estilos

Creemos una función para facilitar la experimentación con diferentes estilos de cajas de texto. En una nueva celda, ingrese y ejecute el siguiente código:

def plot_with_textbox(boxstyle, facecolor, alpha, position=(0.05, 0.95)):
    """
    Create a histogram with a custom text box.

    Parameters:
    boxstyle (str): Style of the box ('round', 'square', 'round4', etc.)
    facecolor (str): Background color of the box
    alpha (float): Transparency of the box (0-1)
    position (tuple): Position of the box in axes coordinates (x, y)
    """
    ## Create figure and plot
    fig, ax = plt.subplots(figsize=(8, 5))
    ax.hist(x, bins=50, color='skyblue', edgecolor='black')

    ## Set title and labels
    ax.set_title(f'Text Box Style: {boxstyle}', fontsize=16)
    ax.set_xlabel('Value', fontsize=12)
    ax.set_ylabel('Frequency', fontsize=12)

    ## Create text box properties
    box_props = dict(boxstyle=boxstyle, facecolor=facecolor, alpha=alpha)

    ## Add text box
    ax.text(position[0], position[1], textstr, transform=ax.transAxes,
            fontsize=14, verticalalignment='top', bbox=box_props)

    plt.tight_layout()
    plt.show()

Ahora, usemos esta función para probar diferentes estilos de cajas. En una nueva celda, ingrese y ejecute:

## Try a square box with light green color
plot_with_textbox('square', 'lightgreen', 0.7)

## Try a rounded box with light blue color
plot_with_textbox('round', 'lightblue', 0.5)

## Try a box with extra rounded corners
plot_with_textbox('round4', 'lightyellow', 0.6)

## Try a sawtooth style box
plot_with_textbox('sawtooth', 'lightcoral', 0.4)

Cuando ejecute esta celda, verá cuatro gráficos diferentes, cada uno con un estilo de caja de texto diferente.

Cambiar la posición de la caja de texto

La posición de una caja de texto puede ser crucial para la visualización. Coloquemos cajas de texto en diferentes esquinas del gráfico. En una nueva celda, ingrese y ejecute:

## Create a figure with a 2x2 grid of subplots
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.flatten()  ## Flatten to easily iterate

## Define positions for the four corners
positions = [
    (0.05, 0.95),  ## Top left
    (0.95, 0.95),  ## Top right
    (0.05, 0.05),  ## Bottom left
    (0.95, 0.05)   ## Bottom right
]

## Define alignments for each position
alignments = [
    ('top', 'left'),          ## Top left
    ('top', 'right'),         ## Top right
    ('bottom', 'left'),       ## Bottom left
    ('bottom', 'right')       ## Bottom right
]

## Corner labels
corner_labels = ['Top Left', 'Top Right', 'Bottom Left', 'Bottom Right']

## Create four plots with text boxes in different corners
for i, ax in enumerate(axes):
    ## Plot histogram
    ax.hist(x, bins=50, color='skyblue', edgecolor='black')

    ## Set title
    ax.set_title(f'Text Box in {corner_labels[i]}', fontsize=14)

    ## Create text box properties
    box_props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)

    ## Add text box
    ax.text(positions[i][0], positions[i][1], textstr,
            transform=ax.transAxes, fontsize=12,
            verticalalignment=alignments[i][0],
            horizontalalignment=alignments[i][1],
            bbox=box_props)

plt.tight_layout()
plt.show()

Este código crea una cuadrícula de 2x2 de histogramas, cada uno con una caja de texto en una esquina diferente.

Comprender el posicionamiento de la caja de texto

Hay varios parámetros clave que controlan el posicionamiento de la caja de texto:

  1. Coordenadas de posición: Las coordenadas (x, y) determinan dónde se coloca la caja de texto. Cuando se usa transform=ax.transAxes, estas están en coordenadas de ejes donde (0, 0) es la esquina inferior izquierda y (1, 1) es la esquina superior derecha.

  2. Alineación vertical: El parámetro verticalalignment controla cómo se alinea el texto verticalmente en relación con la coordenada y:

    • 'top': La parte superior del texto está en la coordenada y especificada.
    • 'center': El centro del texto está en la coordenada y especificada.
    • 'bottom': La parte inferior del texto está en la coordenada y especificada.
  3. Alineación horizontal: El parámetro horizontalalignment controla cómo se alinea el texto horizontalmente en relación con la coordenada x:

    • 'left': El borde izquierdo del texto está en la coordenada x especificada.
    • 'center': El centro del texto está en la coordenada x especificada.
    • 'right': El borde derecho del texto está en la coordenada x especificada.

Estas opciones de alineación son particularmente importantes cuando se coloca texto en las esquinas. Por ejemplo, en la esquina superior derecha, querría usar horizontalalignment='right' para que el borde derecho del texto se alinee con el borde derecho del gráfico.

Creación de una visualización final con múltiples elementos de texto

En este último paso, combinaremos todo lo que hemos aprendido para crear una visualización integral que incluya múltiples elementos de texto con diferentes estilos. Esto demostrará cómo se pueden utilizar las cajas de texto para mejorar la narración de datos.

Creación de una visualización avanzada

Creemos un gráfico más sofisticado que incluya tanto nuestro histograma como algunos elementos visuales adicionales. En una nueva celda, ingrese y ejecute el siguiente código:

## Create a figure with a larger size for our final visualization
fig, ax = plt.subplots(figsize=(12, 8))

## Plot the histogram with more bins and a different color
n, bins, patches = ax.hist(x, bins=75, color='lightblue',
                           edgecolor='darkblue', alpha=0.7)

## Add title and labels with improved styling
ax.set_title('Distribution of Random Data with Statistical Annotations',
             fontsize=18, fontweight='bold', pad=20)
ax.set_xlabel('Value', fontsize=14)
ax.set_ylabel('Frequency', fontsize=14)

## Add grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)

## Mark the mean with a vertical line
ax.axvline(x=mu, color='red', linestyle='-', linewidth=2,
           label=f'Mean: {mu:.2f}')

## Mark one standard deviation range
ax.axvline(x=mu + sigma, color='green', linestyle='--', linewidth=1.5,
           label=f'Mean + 1σ: {mu+sigma:.2f}')
ax.axvline(x=mu - sigma, color='green', linestyle='--', linewidth=1.5,
           label=f'Mean - 1σ: {mu-sigma:.2f}')

## Create a text box with statistics in the top left
stats_box_props = dict(boxstyle='round', facecolor='lightyellow',
                      alpha=0.8, edgecolor='gold', linewidth=2)

stats_text = '\n'.join((
    r'$\mathbf{Statistics:}$',
    r'$\mu=%.2f$ (mean)' % (mu,),
    r'$\mathrm{median}=%.2f$' % (median,),
    r'$\sigma=%.2f$ (std. dev.)' % (sigma,)
))

ax.text(0.05, 0.95, stats_text, transform=ax.transAxes, fontsize=14,
        verticalalignment='top', bbox=stats_box_props)

## Add an informational text box in the top right
info_box_props = dict(boxstyle='round4', facecolor='lightcyan',
                     alpha=0.8, edgecolor='deepskyblue', linewidth=2)

info_text = '\n'.join((
    r'$\mathbf{About\ Normal\ Distributions:}$',
    r'$\bullet\ 68\%\ of\ data\ within\ 1\sigma$',
    r'$\bullet\ 95\%\ of\ data\ within\ 2\sigma$',
    r'$\bullet\ 99.7\%\ of\ data\ within\ 3\sigma$'
))

ax.text(0.95, 0.95, info_text, transform=ax.transAxes, fontsize=14,
        verticalalignment='top', horizontalalignment='right',
        bbox=info_box_props)

## Add a legend
ax.legend(fontsize=12)

## Tighten the layout and show the plot
plt.tight_layout()
plt.show()

Cuando ejecute esta celda, verá una visualización integral con:

  • Un histograma de los datos con un estilo mejorado.
  • Líneas verticales que marcan la media y el rango de una desviación estándar.
  • Una caja de texto con estadísticas en la esquina superior izquierda.
  • Una caja de texto informativa sobre distribuciones normales en la esquina superior derecha.
  • Una leyenda que explica las líneas verticales.

Comprensión de los elementos avanzados

Examinemos algunos de los nuevos elementos que hemos agregado:

  1. Líneas verticales con axvline():

    • Estas líneas marcan estadísticas importantes directamente en el gráfico.
    • El parámetro label permite que estas líneas se incluyan en la leyenda.
  2. Múltiples cajas de texto con diferentes estilos:

    • Cada caja de texto tiene un propósito diferente y utiliza un estilo distinto.
    • La caja de estadísticas muestra los valores calculados a partir de nuestros datos.
    • La caja informativa proporciona contexto sobre las distribuciones normales.
  3. Formato mejorado:

    • Se utiliza el formato LaTeX para crear texto en negrita con \mathbf{}.
    • Se crean viñetas con \bullet.
    • El espaciado se controla con \ (barra invertida seguida de un espacio).
  4. Cuadrícula y leyenda:

    • La cuadrícula ayuda a los espectadores a leer los valores del gráfico con mayor precisión.
    • La leyenda explica el significado de las líneas de color.

Notas finales sobre la colocación de cajas de texto

Al colocar múltiples elementos de texto en una visualización, considere:

  1. Jerarquía visual: La información más importante debe destacarse más.
  2. Posicionamiento: Coloque la información relacionada cerca de las partes relevantes de la visualización.
  3. Contraste: Asegúrese de que el texto sea legible sobre su fondo.
  4. Consistencia: Utilice un estilo consistente para tipos de información similares.
  5. Desorden: Evite abarrotar la visualización con demasiados elementos de texto.

Al colocar y dar estilo a las cajas de texto de manera reflexiva, puede crear visualizaciones que sean informativas y visualmente atractivas, guiando a los espectadores para que comprendan los principales insights de sus datos.

Resumen

En este laboratorio, has aprendido cómo utilizar de manera efectiva las cajas de texto en Matplotlib para mejorar tus visualizaciones de datos. Repasemos los puntos clave:

Conceptos clave cubiertos

  1. Creación de cajas de texto básicas: Aprendiste cómo agregar cajas de texto a los gráficos utilizando la función matplotlib.pyplot.text() con el parámetro bbox.

  2. Posicionamiento de cajas de texto: Descubriste cómo posicionar las cajas de texto utilizando coordenadas de ejes con transform=ax.transAxes, lo que mantiene el texto en una posición fija independientemente de la escala de los datos.

  3. Estilización de cajas de texto: Exploraste cómo personalizar las cajas de texto con diferentes estilos (boxstyle), colores (facecolor), niveles de transparencia (alpha) y propiedades de borde.

  4. Alineación de texto: Practicaste el uso de verticalalignment y horizontalalignment para posicionar adecuadamente el texto en diferentes partes de tu visualización.

  5. Formato LaTeX: Utilizaste la notación LaTeX para agregar símbolos matemáticos y formato a tu texto.

  6. Visualización integral: Creaste una visualización completa que combina múltiples elementos de texto con diferentes estilos para contar una historia coherente de datos.

Aplicaciones prácticas

Las técnicas que aprendiste en este laboratorio se pueden aplicar a:

  • Agregar resúmenes estadísticos a los gráficos.
  • Etiquetar características clave en tus datos.
  • Proporcionar contexto o explicaciones dentro de las visualizaciones.
  • Crear leyendas o claves con formato personalizado.
  • Destacar hallazgos o insights importantes.

Pasos siguientes

Para mejorar aún más tus habilidades de visualización de datos con Matplotlib, considera explorar:

  • Técnicas de anotación avanzadas como flechas y cajas de anotación.
  • Elementos de texto interactivos utilizando el manejo de eventos de Matplotlib.
  • Personalizar el texto con diferentes fuentes y estilos.
  • Crear subgráficos con anotaciones coordinadas.
  • Guardar tus visualizaciones con elementos de texto para su publicación.

Al dominar el arte de las anotaciones de texto en Matplotlib, puedes crear visualizaciones de datos más informativas y profesionales que comuniquen efectivamente tus insights a tu audiencia.