Formatando Gráficos de Moeda com Matplotlib

Beginner

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

Introdução

Ao visualizar dados financeiros, é essencial formatar os eixos apropriadamente com símbolos de moeda. Matplotlib é uma poderosa biblioteca Python para criar visualizações, mas, por padrão, ela não exibe símbolos de moeda nos eixos.

Neste laboratório, aprenderemos como personalizar um gráfico Matplotlib para exibir sinais de dólar nos rótulos do eixo y. Essa habilidade é valiosa ao trabalhar com dados financeiros, números de vendas, orçamentos ou quaisquer outros conjuntos de dados que exijam formatação de moeda.

Dicas da VM

Após a inicialização da VM ser concluída, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para prática.

click-notebook

Você pode precisar esperar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você encontrar algum problema durante o laboratório, sinta-se à vontade para perguntar ao Labby. Por favor, forneça feedback após a sessão, e resolveremos prontamente quaisquer problemas para você.

Configurando Bibliotecas e Criando Dados de Amostra

Neste primeiro passo, importaremos as bibliotecas necessárias e criaremos dados financeiros de amostra para nosso gráfico. Precisamos importar tanto o Matplotlib para visualização quanto o NumPy para geração de dados.

Na primeira célula do seu notebook, insira e execute o seguinte código para importar as bibliotecas necessárias:

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

## Display plots inline in the notebook
%matplotlib inline

print("Libraries imported successfully!")

Após executar o código (pressione Shift+Enter), você deverá ver a saída:

Libraries imported successfully!

libraries-imported

Agora, vamos criar alguns dados financeiros de amostra para visualizar. Dados financeiros frequentemente representam valores ao longo do tempo, então criaremos um conjunto de dados simples que pode representar a receita diária ao longo de um período.

Em uma nova célula, adicione e execute o seguinte 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}")

Após executar este código, você verá os primeiros 5 dias de nossos dados de receita de amostra:

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

Esses dados de amostra representam valores de receita diária entre $1.000 e $5.000 por um período de 30 dias. Usaremos esses dados para criar nosso gráfico no próximo passo.

Criando um Gráfico Financeiro Básico

Agora que temos nossos dados prontos, vamos criar um gráfico básico para visualizar a receita diária. Começaremos com um gráfico de linha simples que mostra a tendência da receita ao longo do período de 30 dias.

Em uma nova célula no seu notebook, adicione e execute o seguinte 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!")

Após executar este código, você deverá ver um gráfico de linha mostrando a tendência da receita diária. Ele deve se parecer com isto (os valores reais podem variar ligeiramente devido à geração aleatória):

Basic Revenue Plot

Vamos detalhar o que fizemos neste código:

  1. fig, ax = plt.subplots(figsize=(10, 6)) - Criou uma figura e eixos com um tamanho de 10×6 polegadas
  2. ax.plot(days, daily_revenue, ...) - Plotou nossos dados com os dias no eixo x e a receita no eixo y
  3. ax.set_xlabel(), ax.set_ylabel(), ax.set_title() - Adicionou rótulos e um título ao nosso gráfico
  4. ax.grid() - Adicionou uma grade para facilitar a leitura dos dados
  5. plt.tight_layout() - Ajustou o preenchimento para garantir que tudo se encaixe bem
  6. plt.show() - Exibiu o gráfico

Observe que o eixo y atualmente mostra números simples sem sinais de dólar. No próximo passo, modificaremos nosso gráfico para exibir a formatação de moeda adequada no eixo y.

Formatando Rótulos do Eixo Y com Sinais de Dólar

Agora que temos nosso gráfico básico, vamos formatar os rótulos do eixo y para exibir sinais de dólar. Isso tornará nossos dados financeiros mais legíveis e profissionalmente apresentados.

Para formatar os rótulos de marcação no eixo y, usaremos o módulo ticker do Matplotlib, que fornece várias opções de formatação. Especificamente, usaremos a classe StrMethodFormatter para criar um formatador personalizado para nosso eixo y.

Em uma nova célula no seu notebook, adicione e execute o seguinte 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!")

Após executar este código, você deverá ver um novo gráfico com sinais de dólar nos rótulos do eixo y.

Vamos explicar a parte chave deste código:

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

Aqui está o que esta string de formatação faz:

  • $ - Adiciona um sinal de dólar no início de cada rótulo
  • {x:,.2f} - Formata o número com:
    • , - Vírgula como separador de milhares (por exemplo, 1.000 em vez de 1000)
    • .2f - Duas casas decimais (por exemplo, $1.234,56)

Este formatador se aplica a todos os rótulos de marcação principais no eixo y. Observe como o gráfico agora indica claramente que os valores estão em dólares, tornando-o muito mais apropriado para a visualização de dados financeiros.

Aprimorando o Gráfico para Melhor Visualização de Dados Financeiros

Agora que temos a formatação básica de moeda em vigor, vamos aprimorar ainda mais nosso gráfico para torná-lo mais útil para a análise de dados financeiros. Adicionaremos várias melhorias:

  1. Uma linha horizontal mostrando a receita diária média
  2. Anotações destacando os dias de receita máxima e mínima
  3. Parâmetros de marcação personalizados para melhor legibilidade
  4. Um título e legenda mais descritivos

Em uma nova célula no seu notebook, adicione e execute o seguinte 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!")

Após executar este código, você deverá ver um gráfico muito mais informativo com:

  1. Formatação de sinal de dólar no eixo y
  2. Uma linha tracejada vermelha horizontal mostrando a receita média
  3. Anotações apontando para os dias de receita máxima e mínima
  4. Marcas de escala mais limpas com melhor espaçamento
  5. Uma legenda mostrando o que cada elemento representa

Vamos explicar alguns dos novos elementos:

  • ax.axhline() - Adiciona uma linha horizontal no valor y especificado (neste caso, nossa receita média)
  • ax.yaxis.set_major_locator() - Controla quantas marcas de escala aparecem no eixo y
  • ax.xaxis.set_major_locator() - Define o eixo x para mostrar marcas de escala em intervalos de 5 dias
  • ax.annotate() - Adiciona anotações de texto com setas apontando para pontos de dados específicos
  • ax.legend() - Adiciona uma legenda explicando os diferentes elementos no gráfico

Essas melhorias tornam o gráfico muito mais útil para análise financeira, destacando estatísticas importantes e tornando os dados mais fáceis de interpretar.

Salvando o Gráfico e Criando uma Função Reutilizável

Nesta etapa final, criaremos uma função reutilizável para gerar gráficos formatados com moeda e salvar nossa visualização em um arquivo. Essa abordagem facilita a aplicação da mesma formatação a diferentes conjuntos de dados financeiros no futuro.

Em uma nova célula no seu notebook, adicione e execute o seguinte 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!")

Após executar este código, você deverá ver:

  1. Um gráfico semelhante ao que criamos na etapa anterior, mas gerado usando nossa função personalizada
  2. Uma mensagem confirmando que o gráfico foi salvo em um arquivo chamado revenue_plot.png

A função que criamos:

  • Aceita dados para os eixos x e y
  • Permite a personalização de rótulos e título
  • Tem uma opção para salvar o gráfico em um arquivo
  • Pode mostrar ou ocultar estatísticas como média, mínimo e máximo
  • Retorna os objetos de figura e eixos para personalização adicional, se necessário

Essa função reutilizável facilita a criação de gráficos financeiros formatados de forma consistente no futuro. Você pode simplesmente chamar essa função com diferentes conjuntos de dados, e ela tratará toda a formatação de moeda e anotações estatísticas automaticamente.

Para verificar se nosso gráfico foi salvo corretamente, vamos verificar se o arquivo 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.")

Você deverá ver uma mensagem confirmando que o arquivo existe e seu tamanho.

Parabéns! Você aprendeu com sucesso como formatar gráficos com sinais de dólar e criar visualizações financeiras com aparência profissional usando Matplotlib.

Resumo

Neste laboratório, aprendemos como criar gráficos financeiros com formatação de moeda adequada usando Matplotlib. Cobrimos vários conceitos importantes:

  1. Geração e trabalho com dados financeiros de amostra
  2. Criação de gráficos básicos com Matplotlib
  3. Formatação de rótulos do eixo y com sinais de dólar usando a classe StrMethodFormatter
  4. Aprimoramento de gráficos com estatísticas, anotações e estilo aprimorado
  5. Criação de uma função reutilizável para gerar gráficos consistentes formatados com moeda

Essas habilidades são essenciais para qualquer pessoa que trabalhe com visualização de dados financeiros, pois permitem que você crie gráficos profissionais e informativos que comunicam claramente os valores monetários.

As técnicas que você aprendeu podem ser aplicadas a vários conjuntos de dados financeiros, como:

  • Relatórios de vendas e receita
  • Análise de orçamento
  • Acompanhamento do desempenho de investimentos
  • Análise de custos
  • Rastreamento de despesas

Ao formatar adequadamente seus eixos com símbolos de moeda, você torna suas visualizações mais intuitivas e profissionais, aprimorando a eficácia da sua comunicação de dados.