Formateo de Gráficas de Moneda con Matplotlib

Beginner

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

Introducción

Al visualizar datos financieros, es esencial formatear adecuadamente los ejes con símbolos de moneda. Matplotlib es una poderosa biblioteca de Python para crear visualizaciones, pero por defecto, no muestra símbolos de moneda en los ejes.

En este laboratorio, aprenderemos cómo personalizar una gráfica de Matplotlib para mostrar signos de dólar en las etiquetas del eje y. Esta habilidad es valiosa cuando se trabaja con datos financieros, cifras de ventas, presupuestos o cualquier otro conjunto de datos que requiera formato de moneda.

Consejos para 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. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si encuentra algún problema durante el laboratorio, no dude en preguntar a Labby. Por favor, brinde comentarios después de la sesión y resolveremos rápidamente cualquier problema para usted.

Configuración de Bibliotecas y Creación de Datos de Muestra

En este primer paso, importaremos las bibliotecas necesarias y crearemos datos financieros de muestra para nuestra gráfica. Necesitamos importar tanto Matplotlib para la visualización como NumPy para la generación de datos.

En la primera celda de su cuaderno (notebook), ingrese y ejecute el siguiente código para importar las bibliotecas requeridas:

## Import necessary libraries
import matplotlib.pyplot as plt
import numpy as np

## Display plots inline in the notebook
%matplotlib inline

print("Libraries imported successfully!")

Después de ejecutar el código (presione Shift+Enter), debería ver la salida:

Libraries imported successfully!
libraries-imported

Ahora, creemos algunos datos financieros de muestra para visualizar. Los datos financieros a menudo representan valores a lo largo del tiempo, por lo que crearemos un conjunto de datos simple que podría representar los ingresos diarios durante un período de tiempo.

En una nueva celda, agregue y ejecute el siguiente código:

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

## Generate financial data: 30 days of revenue data
days = np.arange(1, 31)
daily_revenue = np.random.uniform(low=1000, high=5000, size=30)

print("Sample of daily revenue data (first 5 days):")
for i in range(5):
    print(f"Day {days[i]}: ${daily_revenue[i]:.2f}")

Después de ejecutar este código, verá los primeros 5 días de nuestros datos de ingresos de muestra:

Sample of daily revenue data (first 5 days):
Day 1: $3745.40
Day 2: $3992.60
Day 3: $2827.45
Day 4: $4137.54
Day 5: $1579.63

Este conjunto de datos de muestra representa valores de ingresos diarios entre $1,000 y $5,000 durante un período de 30 días. Usaremos estos datos para crear nuestra gráfica en el siguiente paso.

Creación de una Gráfica Financiera Básica

Ahora que tenemos nuestros datos listos, creemos una gráfica básica para visualizar los ingresos diarios. Comenzaremos con una simple gráfica de línea que muestre la tendencia de los ingresos durante el período de 30 días.

En una nueva celda de su cuaderno (notebook), agregue y ejecute el siguiente código:

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

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue', linewidth=2, markersize=6)

## Add labels and title
ax.set_xlabel('Day', fontsize=12)
ax.set_ylabel('Revenue', fontsize=12)
ax.set_title('Daily Revenue Over 30 Days', fontsize=14, fontweight='bold')

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

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

print("Basic plot created successfully!")

Después de ejecutar este código, debería ver una gráfica de línea que muestra la tendencia de los ingresos diarios. Debería verse algo así (los valores reales pueden variar ligeramente debido a la generación aleatoria):

Basic Revenue Plot

Analicemos lo que hicimos en este código:

  1. fig, ax = plt.subplots(figsize=(10, 6)) - Creamos una figura y ejes con un tamaño de 10×6 pulgadas
  2. ax.plot(days, daily_revenue, ...) - Graficamos nuestros datos con los días en el eje x y los ingresos en el eje y
  3. ax.set_xlabel(), ax.set_ylabel(), ax.set_title() - Agregamos etiquetas y un título a nuestra gráfica
  4. ax.grid() - Agregamos una cuadrícula para que los datos sean más fáciles de leer
  5. plt.tight_layout() - Ajustamos el relleno para asegurarnos de que todo quede bien dispuesto
  6. plt.show() - Mostramos la gráfica

Note que actualmente el eje y muestra números simples sin signos de dólar. En el siguiente paso, modificaremos nuestra gráfica para mostrar un formato de moneda adecuado en el eje y.

Formateo de las Etiquetas del Eje Y con Signos de Dólar

Ahora que tenemos nuestra gráfica básica, formateemos las etiquetas del eje y para mostrar signos de dólar. Esto hará que nuestros datos financieros sean más legibles y se presenten de manera más profesional.

Para formatear las etiquetas de las marcas (ticks) en el eje y, utilizaremos el módulo ticker de Matplotlib, que proporciona diversas opciones de formato. En concreto, usaremos la clase StrMethodFormatter para crear un formateador personalizado para nuestro eje y.

En una nueva celda de su cuaderno (notebook), agregue y ejecute el siguiente código:

## Import the necessary module for formatting
import matplotlib.ticker as ticker

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

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue', linewidth=2, markersize=6)

## Format y-axis with dollar signs
formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

## Add labels and title
ax.set_xlabel('Day', fontsize=12)
ax.set_ylabel('Revenue ($)', fontsize=12)
ax.set_title('Daily Revenue Over 30 Days', fontsize=14, fontweight='bold')

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

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

print("Plot with dollar-formatted y-axis created!")

Después de ejecutar este código, debería ver una nueva gráfica con signos de dólar en las etiquetas del eje y.

Expliquemos la parte clave de este código:

formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

Esto es lo que hace esta cadena de formato:

  • $ - Agrega un signo de dólar al principio de cada etiqueta
  • {x:,.2f} - Formatea el número con:
    • , - Una coma como separador de miles (por ejemplo, 1,000 en lugar de 1000)
    • .2f - Dos decimales (por ejemplo, $1,234.56)

Este formateador se aplica a todas las etiquetas de las marcas principales en el eje y. Note cómo la gráfica ahora indica claramente que los valores están en dólares, lo que la hace mucho más adecuada para la visualización de datos financieros.

Mejora de la Gráfica para una Mejor Visualización de Datos Financieros

Ahora que tenemos el formato básico de moneda establecido, mejoremos nuestra gráfica aún más para que sea más útil para el análisis de datos financieros. Realizaremos varias mejoras:

  1. Una línea horizontal que muestre el ingreso diario promedio
  2. Anotaciones que resalten los días de ingresos máximo y mínimo
  3. Parámetros personalizados de las marcas (ticks) para una mejor legibilidad
  4. Un título y una leyenda más descriptivos

En una nueva celda de su cuaderno (notebook), agregue y ejecute el siguiente código:

## Import the necessary module for formatting
import matplotlib.ticker as ticker

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

## Plot the daily revenue data
ax.plot(days, daily_revenue, marker='o', linestyle='-', color='blue',
        linewidth=2, markersize=6, label='Daily Revenue')

## Calculate statistics
avg_revenue = np.mean(daily_revenue)
max_revenue = np.max(daily_revenue)
min_revenue = np.min(daily_revenue)
max_day = days[np.argmax(daily_revenue)]
min_day = days[np.argmin(daily_revenue)]

## Add a horizontal line for average revenue
ax.axhline(y=avg_revenue, color='r', linestyle='--', alpha=0.7,
           label=f'Average Revenue: ${avg_revenue:.2f}')

## Format y-axis with dollar signs
formatter = ticker.StrMethodFormatter('${x:,.2f}')
ax.yaxis.set_major_formatter(formatter)

## Customize tick parameters
ax.tick_params(axis='both', which='major', labelsize=10)
ax.yaxis.set_major_locator(ticker.MaxNLocator(nbins=10))
ax.xaxis.set_major_locator(ticker.MultipleLocator(base=5))

## Add annotations for max and min revenue
ax.annotate(f'Max: ${max_revenue:.2f}', xy=(max_day, max_revenue),
            xytext=(max_day+1, max_revenue+200),
            arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

ax.annotate(f'Min: ${min_revenue:.2f}', xy=(min_day, min_revenue),
            xytext=(min_day+1, min_revenue-200),
            arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

## Add labels and title
ax.set_xlabel('Day of Month', fontsize=12)
ax.set_ylabel('Revenue ($)', fontsize=12)
ax.set_title('Daily Revenue Analysis - 30 Day Period', fontsize=14, fontweight='bold')

## Set x-axis limits to show a bit of padding
ax.set_xlim(0, 31)

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

## Add legend
ax.legend(loc='upper right', fontsize=10)

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

print("Enhanced financial plot created successfully!")

Después de ejecutar este código, debería ver una gráfica mucho más informativa con:

  1. Formato de signo de dólar en el eje y
  2. Una línea horizontal roja discontinua que muestra el ingreso promedio
  3. Anotaciones que apuntan a los días de ingresos máximo y mínimo
  4. Marcas (ticks) más limpias con un mejor espaciado
  5. Una leyenda que muestra lo que representa cada elemento

Expliquemos algunos de los nuevos elementos:

  • ax.axhline() - Agrega una línea horizontal en el valor y especificado (en este caso, nuestro ingreso promedio)
  • ax.yaxis.set_major_locator() - Controla cuántas marcas (ticks) aparecen en el eje y
  • ax.xaxis.set_major_locator() - Establece que el eje x muestre marcas cada 5 días
  • ax.annotate() - Agrega anotaciones de texto con flechas que apuntan a puntos de datos específicos
  • ax.legend() - Agrega una leyenda que explica los diferentes elementos de la gráfica

Estas mejoras hacen que la gráfica sea mucho más útil para el análisis financiero al resaltar estadísticas clave y hacer que los datos sean más fáciles de interpretar.

Guardar la Gráfica y Crear una Función Reutilizable

En este último paso, crearemos una función reutilizable para generar gráficas con formato de moneda y guardaremos nuestra visualización en un archivo. Este enfoque facilita aplicar el mismo formato a diferentes conjuntos de datos financieros en el futuro.

En una nueva celda de su cuaderno (notebook), agregue y ejecute el siguiente código:

def create_currency_plot(x_data, y_data, title='Financial Data',
                         xlabel='X-Axis', ylabel='Amount ($)',
                         filename=None, show_stats=True):
    """
    Create a plot with currency formatting on the y-axis.

    Parameters:
    -----------
    x_data : array-like
        Data for the x-axis
    y_data : array-like
        Data for the y-axis (currency values)
    title : str
        Title of the plot
    xlabel : str
        Label for the x-axis
    ylabel : str
        Label for the y-axis
    filename : str, optional
        If provided, save the plot to this filename
    show_stats : bool
        Whether to show statistics (average, min, max)

    Returns:
    --------
    fig, ax : tuple
        The figure and axes objects
    """
    ## Import the necessary module for formatting
    import matplotlib.ticker as ticker

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

    ## Plot the data
    ax.plot(x_data, y_data, marker='o', linestyle='-', color='blue',
            linewidth=2, markersize=6, label='Data')

    if show_stats:
        ## Calculate statistics
        avg_value = np.mean(y_data)
        max_value = np.max(y_data)
        min_value = np.min(y_data)
        max_x = x_data[np.argmax(y_data)]
        min_x = x_data[np.argmin(y_data)]

        ## Add a horizontal line for average value
        ax.axhline(y=avg_value, color='r', linestyle='--', alpha=0.7,
                   label=f'Average: ${avg_value:.2f}')

        ## Add annotations for max and min values
        ax.annotate(f'Max: ${max_value:.2f}', xy=(max_x, max_value),
                    xytext=(max_x+1, max_value+200),
                    arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

        ax.annotate(f'Min: ${min_value:.2f}', xy=(min_x, min_value),
                    xytext=(min_x+1, min_value-200),
                    arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))

    ## Format y-axis with dollar signs
    formatter = ticker.StrMethodFormatter('${x:,.2f}')
    ax.yaxis.set_major_formatter(formatter)

    ## Customize tick parameters
    ax.tick_params(axis='both', which='major', labelsize=10)

    ## Add labels and title
    ax.set_xlabel(xlabel, fontsize=12)
    ax.set_ylabel(ylabel, fontsize=12)
    ax.set_title(title, fontsize=14, fontweight='bold')

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

    ## Add legend
    if show_stats:
        ax.legend(loc='best', fontsize=10)

    ## Adjust layout
    plt.tight_layout()

    ## Save the plot if filename is provided
    if filename:
        plt.savefig(filename, dpi=300, bbox_inches='tight')
        print(f"Plot saved as '{filename}'")

    return fig, ax

## Use our function to create and save a plot
fig, ax = create_currency_plot(
    days,
    daily_revenue,
    title='Monthly Revenue Report',
    xlabel='Day of Month',
    ylabel='Daily Revenue ($)',
    filename='revenue_plot.png'
)

## Display the plot
plt.show()

print("Function created and plot saved successfully!")

Después de ejecutar este código, debería ver:

  1. Una gráfica similar a la que creamos en el paso anterior, pero generada utilizando nuestra función personalizada.
  2. Un mensaje que confirma que la gráfica se ha guardado en un archivo llamado revenue_plot.png.

La función que creamos:

  • Toma datos para los ejes x e y.
  • Permite personalizar las etiquetas y el título.
  • Tiene una opción para guardar la gráfica en un archivo.
  • Puede mostrar u ocultar estadísticas como el promedio, el mínimo y el máximo.
  • Devuelve los objetos de la figura y los ejes para una mayor personalización si es necesario.

Esta función reutilizable facilita crear gráficas financieras con un formato consistente en el futuro. Simplemente puede llamar a esta función con diferentes conjuntos de datos, y manejará automáticamente todo el formato de moneda y las anotaciones estadísticas.

Para verificar que nuestra gráfica se haya guardado correctamente, comprobemos si el archivo existe:

import os
if os.path.exists('revenue_plot.png'):
    print("Plot file exists! Size:", os.path.getsize('revenue_plot.png'), "bytes")
else:
    print("Plot file was not saved correctly.")

Debería ver un mensaje que confirme que el archivo existe y su tamaño.

¡Felicidades! Ha aprendido con éxito cómo formatear gráficas con signos de dólar y crear visualizaciones financieras de aspecto profesional utilizando Matplotlib.

Resumen

En este laboratorio (lab), aprendimos cómo crear gráficas financieras con un formato de moneda adecuado utilizando Matplotlib. Cubrimos varios conceptos importantes:

  1. Generar y trabajar con datos financieros de muestra.
  2. Crear gráficas básicas con Matplotlib.
  3. Formatear las etiquetas del eje y con signos de dólar utilizando la clase StrMethodFormatter.
  4. Mejorar las gráficas con estadísticas, anotaciones y un estilo mejorado.
  5. Crear una función reutilizable para generar gráficas con formato de moneda consistente.

Estas habilidades son esenciales para cualquier persona que trabaje con visualización de datos financieros, ya que le permiten crear gráficos profesionales e informativos que comuniquen claramente los valores monetarios.

Las técnicas que aprendiste se pueden aplicar a varios conjuntos de datos financieros, como:

  • Informes de ventas e ingresos.
  • Análisis de presupuesto.
  • Seguimiento del rendimiento de inversiones.
  • Análisis de costos.
  • Seguimiento de gastos.

Al formatear adecuadamente los ejes con símbolos de moneda, haces que tus visualizaciones sean más intuitivas y profesionales, mejorando la eficacia de la comunicación de tus datos.