Pandas Para Pintar - Coloring Pages Pandas Kawaii Para Pintar
Coloring Pages Pandas Kawaii Para Pintar

Usando pandas para pintar gráficos e visualizações

Todo mundo que já precisou plotar algo rápido no trabalho aprende na marra que pandas tem um backend de plotagem embutido. Não é Matplotlib puro, não é Plotly. É uma camada por cima que serve para coisas simples e vira pesadelo quando você tenta controlar o mínimo detalhe. O caminho mais direto começa com um DataFrame e a função plot(). O pandas delega para o matplotlib automaticamente, desde que você tenha ambos instalados. Se não tiver, roda um pip install pandas matplotlib e já era.

pandas para pintar com controle fino

A maioria das pessoas para no primeiro exemplo da documentação. Linhas, barras, scatter. Funciona. Mas logo depois aparece aquele gráfico onde você precisa ajustar a escala do eixo Y apenas para três pontos específicos, ou mudar a cor de uma barra sem afetar as outras, ou ainda salvar em SVG com resolução imprevisível. Aí a coisa aperta. Eu tive um problema recentemente com um DataFrame de vendas trimestrais onde os valores de 2023 estavam na ordem de milhões e os de 2024 em milhares por causa de um erro de conversão de moeda que passou despercebido. Quando chamei df.plot() normal, o gráfico ficou achatado porque o eixo Y escalava para o maior valor. A solução foi identificar os outliers com df.quantile(), separar em dois subplots usando ax[0] e ax[1], e aí sim chamar plot nos eixos corretos. Simples, mas demorei duas horas pra perceber que o problema não era o código de plotagem e sim os dados.

Outro detalhe que não ensinam: o pandas plot usa o índice do DataFrame como eixo X por padrão. Se o seu índice não for ordenado, o gráfico de linha vai tracer entre pontos fora de ordem e ninguém percebe até olhar com atenção. Sempre faça df = df.sort_index() antes de chamar plot em séries temporais. Custa nada e evita frustração.

Exemplo prático passo a passo

Vamos supor que você tenha dados de temperatura coletados a cada hora durante uma semana e quer plotar a média por dia com intervalos de confiança. O processo direto seria: Crie o DataFrame com as colunas data, hora e temperatura. Converta data e hora para datetime usando pd.to_datetime() nas duas colunas e depois crie uma coluna de período usando dt.date. Agrupe por período com groupby().agg() calculando mean e std. Multiplique o desvio padrão por 1.96 para o intervalo de 95%. Plote a média com Linha e use fill_between para a faixa de confiança.

O código real ficaria algo como:

👉 Clique no botão abaixo para saber mais sobre o assunto!

import pandas as pd import matplotlib.pyplot as plt import numpy as np df['periodo'] = pd.to_datetime(df['data']) media = df.groupby(df['periodo'].dt.date)['temperatura'].mean() std = df.groupby(df['periodo'].dt.date)['temperatura'].std() n = df.groupby(df['periodo'].dt.date)['temperatura'].count() fig, ax = plt.subplots() ax.plot(media.index, media.values, marker='o') ax.fill_between(media.index, media - 1.96 * std / np.sqrt(n), media + 1.96 * std / np.sqrt(n), alpha=0.2) ax.set_xlabel('Data') ax.set_ylabel('Temperatura média (°C)') plt.tight_layout() plt.show()

Repare que eu dividi o desvio padrão pela raiz quadrada do tamanho da amostra. Muita gente esquece isso e pinta um intervalo que é quatro vezes maior do que deveria. O gráfico fica bonito mas mentiroso.

Limitações que ninguém menciona

O método de plotagem embutido do pandas não suporta interatividade. Se você precisa de zoom, tooltips ou exportação dinâmica, tem que usar outro pacote. Plotly funciona bem nesse caso, mas aí você perde a conveniência do df.plot() direto e precisa usar px ou go.Figure. O trade-off é real: praticidade versus controle. Também há um problema de performance que passa despercebido. Quando o DataFrame tem mais de 50 mil linhas e você chama plot() sem resumir, o matplotlib demora entre 8 e 15 segundos para renderizar em máquinas comuns. Eu descobri isso num projeto de telemetria de veículos onde os sensores mandavam dados a cada segundo. O plot parecia travar o interpretador. A solução foi downsample usando resample('1min').mean() antes de chamar plot. O gráfico perdeu granularidade mas ficou legível e processou em menos de 2 segundos.

Outro ponto: cores. O pandas usa o ciclo padrão do matplotlib, que é azul, laranja, verde, vermelho... Se você tem mais de quatro séries no mesmo gráfico, as cores começam a repetir e a legenda vira uma briga visual. Passe um array de cores manualmente via color=['#hex1', '#hex2', ...] ou use o parâmetro colormap='tab20' que dá vinte cores distintas sem esforço.

Salvando os gráficos

Para salvar, prefira plt.savefig() em vez de rely no retorno do plot(). O pandas plot retorna um objeto Axes do matplotlib, então você pode chamar savefig direto nele. Especifique dpi=300 para impressão e bbox_inches='tight' para evitar cortes nos rótulos. Sem bbox_inches,Labels do eixo X frequentemente aparecem cortados em PDFs gerados automaticamente. Se o objetivo é publicar em artigo ou relatório técnico, salvar em SVG é mais seguro que PNG porque não perde qualidade ao ampliar. O matplotlib converte vetorialmente de graça e o arquivo fica menor que um PNG equivalente em resolução alta.

Quando não usar pandas para pintar

Se seus dados não cabem num DataFrame ou a estrutura é tabular mas a visualização exige geoespacial, mapas de calor complexos ou gráficos de rede, pandas não é a ferramenta certa. Use geopandas para mapas, seaborn para estatísticas avançadas, ou plotly para dashboards interativos. pandas serve para o que é rápido e direto. Para qualquer coisa que exija mais de três ajustes finos no mesmo gráfico, já vale a pena ir pro matplotlib puro ou trocar de biblioteca. Instale com pip install pandas matplotlib se ainda não tiver. O resto é prática.