Curso de Python / Visualizar resultados com Matplotlib e salvar um gráfico

Matplotlib cria gráficos a partir de dados, eixos e rótulos explícitos. Para comparar totais de despesas, um gráfico de barras com unidade indicada e eixo iniciado em zero permite conferir diretamente os valores; nesta prática, o resultado é salvo em arquivo, sem abrir uma janela.

Escolher a comparação antes de desenhar

Para comparar categorias, coloque as categorias no eixo horizontal e as quantias no vertical. Para estudar mudanças ao longo do tempo, você precisaria de datas ordenadas e de um desenho adequado a essa pergunta. Um gráfico não corrige uma agregação errada: confira valores, unidades e dados ausentes antes de desenhar.

O exemplo usa alimentação de 11500 e transporte de 2500, em KRW, a unidade monetária mantida da amostra original. Não há conversão de moedas. A aula de pandas e validação de tabelas mostra como preparar totais conferíveis.

Selecione o ambiente virtual do projeto e instale o pacote externo:

python -m pip install matplotlib

Use uma versão compatível com seu Python e sistema. A instalação precisa ocorrer no ambiente usado pelo terminal que executará o script. Consulte a documentação de Axes.bar para os parâmetros do gráfico de barras.

Criar e salvar um gráfico completo

Use uma pasta de saída nova, pois salvar substitui um arquivo existente com o mesmo nome. Salve o programa completo abaixo como chart.py, em UTF-8, e execute python chart.py no ambiente selecionado. Fora de um ambiente virtual no macOS ou Ubuntu, use python3 se esse for o nome do interpretador. Esta primeira versão conserva os textos ingleses; a adaptação em português aparece adiante.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 18, "axes.titlesize": 22, "axes.labelsize": 20, "xtick.labelsize": 18, "ytick.labelsize": 18})

categories = ["food", "transport"]
amounts = [11500, 2500]
fig, ax = plt.subplots(figsize=(7, 4), layout="constrained")
bars = ax.bar(categories, amounts, color=["#2b6cb0", "#d69e2e"])
ax.set_ylabel("Amount (KRW)")
ax.set_title("Expenses by category")
ax.set_ylim(0, max(amounts) * 1.2)
ax.bar_label(bars, fmt="%.0f", padding=3)
fig.savefig("expense-chart.png", dpi=160)
plt.close(fig)
print("saved expense-chart.png")

Resultado esperado no terminal:

saved expense-chart.png

A mensagem confirma que o arquivo expense-chart.png foi salvo no diretório atual. Uma figura de 7 × 4 polegadas, gravada a 160 pontos por polegada, produz 1120 × 640 pixels. Abra o arquivo para conferir o conteúdo, além de verificar a existência.

ax.bar desenha as duas alturas; bar_label escreve seus números, e set_ylim deixa o eixo começar em zero e reserva espaço acima da maior barra. O formato %.0f mostra os valores sem casas decimais, coerente com os inteiros desta amostra. A documentação de Figure.savefig explica dimensões, resolução e gravação.

Distinguir Figure, Axes e o backend

Figure é a imagem inteira; Axes é a região que contém coordenadas e dados. As referências explícitas fig e ax deixam claro qual imagem e qual região cada operação modifica, especialmente quando existem vários gráficos.

Agg é um backend para produzir arquivos sem interface gráfica, adequado a este exemplo e a relatórios automáticos. A seleção ocorre antes da importação de pyplot. Para tentar uma janela em um ambiente de desktop, remova a seleção de Agg e chame plt.show() depois de salvar, antes de fechar a figura; isso requer um backend gráfico disponível.

plt.close(fig) libera a figura do gerenciamento de janelas do pyplot após a gravação. Mantenha esse cuidado em repetições de geração de relatórios. A ausência de uma janela é esperada com Agg e não significa que o PNG deixou de ser criado.

Adaptar os textos e verificar a fonte

Para a variante em português, substitua a lista de categorias por ["Alimentação", "Transporte"], o título por "Despesas por categoria" e o rótulo vertical por "Valor (KRW)". Preserve as quantias, as dimensões e os limites do eixo: traduzir os textos não deve mudar as alturas das barras.

A fonte precisa conter os caracteres usados, inclusive ç e ã. Na imagem em português abaixo, Noto Sans foi aplicada, e o arquivo de fonte efetivamente selecionado pelo Matplotlib foi verificado. Uma fonte que atende ao português não necessariamente contém todos os caracteres de coreano ou japonês.

O bloco a seguir demonstra o carregamento de um arquivo de fonte. O caminho Windows do exemplo corresponde a Malgun Gothic. Para a variante em português com Noto Sans, altere font_path para o caminho real do seu arquivo Noto Sans. Insira o bloco depois de importar pyplot como plt e antes de criar fig.

from matplotlib import font_manager
font_path = "C:/Windows/Fonts/malgun.ttf"
font_manager.fontManager.addfont(font_path)
plt.rcParams["font.family"] = font_manager.FontProperties(fname=font_path).get_name()
plt.rcParams["axes.unicode_minus"] = False

Confirme que o arquivo existe e que você pode usar a fonte. Se houver várias fontes instaladas com o mesmo nome de família, confira o arquivo resolvido; um nome configurado não comprova sozinho qual arquivo foi escolhido. Veja FontProperties e gerenciamento de fontes.

Este é o resultado realmente gravado após as substituições em português e a aplicação de Noto Sans. As duas quantias continuam em KRW, no mesmo eixo iniciado em zero:

Gráfico de barras com alimentação de 11.500 KRW e transporte de 2.500 KRW, no mesmo eixo iniciado em zero.

Conferir legibilidade e preservar a comparação

  1. Abra o PNG e confira duas barras, os valores 11500 e 2500, a unidade KRW e o início do eixo em zero. Verifique também os acentos dos rótulos.
  2. Em uma cópia descartável, troque somente figsize=(7, 4) por figsize=(4, 4). Examine se o título foi cortado ou se as categorias ficaram sobrepostas. layout="constrained" não garante que qualquer texto caiba em toda largura.
  3. Restaure figsize=(7, 4) e regenere a imagem. Confira que os textos voltaram a caber e que os valores e a linha de base continuam iguais.
  4. Examine a imagem reduzida à largura de um telefone. Se a leitura ficar difícil, ajuste dimensões, tamanho da fonte ou texto; preserve a correspondência entre números e alturas.

savefig substitui o mesmo caminho. Use nomes com data ou identificador de execução quando precisar preservar versões. O PNG é o resultado da prática; a figura publicada nesta página foi convertida para WebP sem perdas após a verificação visual.

Não corte o eixo das barras para exagerar diferenças nem use áreas decorativas que contradigam os valores. Unidade explícita, rótulos legíveis e números visíveis tornam a comparação verificável, enquanto a validação anterior estabelece o significado dos dados mostrados.