Pandas: Visualização de Dados

Última atualização: 2026-08-26

Ninguém quer ficar olhando para números crus — seu chefe quer gráficos, relatórios precisam de gráficos, e apresentações precisam de gráficos. O df.plot do Pandas gera um gráfico em uma única linha, alimentado pelo motor Matplotlib por trás das cortinas. Esta seção abrange os 8 tipos de gráficos mais comuns, layouts de subplots e personalização de estilo para que você possa transformar rapidamente qualquer DataFrame em um relatório visual.

⚠️ Nota: O código abaixo deve ser executado em um ambiente local de Python com o matplotlib instalado.

1. What You Will Learn


2. Relatório de Visualização de Vendas do Bob

(1) O Problema: Ninguém Lê Tabelas

Bob apresenta vendas mensais ao seu chefe, mas ninguém se preocupa em olhar tabelas simples.

(2) A Solução: Gráficos em uma Linha com df.plot

▶ Exemplo: Básico do df.plot (Dificuldade ⭐)

PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Sample data
df = pd.DataFrame({
    'month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
    'sales': [3200, 3500, 3800, 3600, 4100, 4500],
    'cost': [2000, 2200, 2400, 2300, 2600, 2800]
})
df = df.set_index('month')

# Line chart — one line of code!
df['sales'].plot(kind='line', title='Monthly Sales Trend', figsize=(8, 4))
plt.ylabel('Sales ($)')
plt.tight_layout()
# plt.savefig('sales_trend.png', dpi=150)
# plt.show()
print("Line chart created!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

3. Referência Rápida de Tipos de Gráfico

(1) 8 Tipos Comuns de Gráfico

Tipo Gráfico Caso de Uso
line Gráfico de linha Tendências temporais
bar Gráfico de barras Comparação entre categorias
barh Gráfico de barras horizontal Categorias com rótulos longos
hist Histograma Distribuição
box Box plot Distribuição + valores atípicos
scatter Gráfico de dispersão Correlação
pie Gráfico de pizza Proporções
area Gráfico de área Tendências cumulativas
kde Estimativa de densidade kernel Distribuição suavizada

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado -- por favor, instale localmente (`pip install pandas`) e siga alongando. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

: Múltiplos Tipos de Gráfico (Dificuldade ⭐⭐)

PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
df = pd.DataFrame({
    'category': ['Electronics', 'Clothing', 'Home', 'Sports', 'Books'],
    'sales': [5000, 3000, 2000, 1500, 800],
    'avg_price': [299, 55, 75, 45, 15],
    'rating': [4.5, 4.2, 3.9, 4.0, 4.3]
})

# Gráfico de barras — comparação entre categorias
df.plot(kind='bar', x='category', y='sales', title='Vendas por Categoria', figsize=(8, 4))
# plt.show()

# Gráfico de barras horizontal — melhor para rótulos longos
df.plot(kind='barh', x='category', y='sales')
# plt.show()

# Gráfico de pizza — proporções
df.set_index('category')['sales'].plot(kind='pie', autopct='%1.1f%%', figsize=(6, 6))
# plt.show()

# Histograma — distribuição
prices = pd.Series(np.random.normal(100, 30, 500))
prices.plot(kind='hist', bins=20, title='Distribuição de Preços')
# plt.show()

# Box plot — distribuição + valores atípicos
scores = pd.DataFrame({
    'Math': np.random.normal(75, 10, 100),
    'English': np.random.normal(80, 12, 100),
    'Science': np.random.normal(70, 15, 100)
})
scores.plot(kind='box', title='Distribuição de Notas por Matéria')
# plt.show()

# Gráfico de dispersão — correlação
df.plot(kind='scatter', x='avg_price', y='rating', title='Preço vs Avaliação', s=100)
# plt.show()
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado -- por favor, instale localmente (`pip install pandas`) e siga alongando. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

4. Layout de Subplots

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

: subplots Layout de Múltiplos Gráficos (Dificuldade ⭐⭐)

PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
df = pd.DataFrame({
    'A': np.random.randn(50).cumsum(),
    'B': np.random.randn(50).cumsum(),
    'C': np.random.randn(50).cumsum(),
    'D': np.random.randn(50).cumsum()
})

# Each column in its own subplot
df.plot(subplots=True, layout=(2, 2), figsize=(10, 8), sharey=True)
plt.suptitle('4 Series Trend')
plt.tight_layout()
# plt.show()

# Custom layout
df[['A', 'B']].plot(subplots=True, layout=(1, 2), figsize=(12, 4))
# plt.show()
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

5. Personalização de Estilo

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

: Personalização de Estilo (Dificuldade ⭐⭐)

PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
df = pd.DataFrame({
    'sales': np.random.randint(100, 500, 12),
    'profit': np.random.randint(10, 150, 12)
}, index=pd.date_range('2024-01', periods=12, freq='MS').strftime('%b'))

# Cores, marcadores e estilo de linha personalizados
ax = df.plot(
    kind='line',
    style=['o-', 's--'],     # marcadores + estilo de linha
    color=['#2196F3', '#FF5722'],  # cores personalizadas
    figsize=(10, 5),
    title='Vendas e Lucro Mensal',
    xlabel='Mês',
    ylabel='Valor ($)',
    grid=True,
    alpha=0.8
)

# Adicionar anotações
ax.axhline(y=df['sales'].mean(), color='gray', linestyle=':', label='Média de Vendas')
ax.legend(loc='upper left')
plt.tight_layout()
# plt.show()
print("Gráfico estilizado criado!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

6. Pandas versus Matplotlib

Recurso df.plot Matplotlib
Linhas de código 1 5-15
Flexibilidade Média Alta
Curva de aprendizado Baixa Alta
Personalização Básica Ilimitada
Relação Encapsula Matplotlib Motor subjacente
💡 Tip: df.plot retorna um objeto Axes do Matplotlib, para que você possa continuar refinando-o com métodos do Matplotlib. Estratégia: use df.plot para um rascunho rápido, depois ajuste os detalhes através do objeto Axes.


7. Exemplo Completo: Relatório de Visualização de Vendas de E-Commerce

(4) ▶ Árvore de Decisão para Seleção de Gráficos

100%
graph TB
    A[O que você quer mostrar?] --> B{Tendência ao longo do tempo?}
    B -->|Sim| C[Gráfico de linhas]
    B -->|Não| D{Comparação entre categorias?}
    D -->|Sim| E[Gráfico de barras]
    D -->|Não| F{Distribuição dos dados?}
    F -->|Sim| G[Histograma hist / Box plot]
    F -->|Não| H{Correlação?}
    H -->|Sim| I[Gráfico de dispersão]
    H -->|Não| J{Proporções?}
    J -->|Sim| K[Gráfico de pizza]
    J -->|Não| L[Gráfico de área]
TEXT 📖 Somente leitura
> **Saída:** Execute isto em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e siga along. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isto em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e siga along. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

: Fluxo de Trabalho do Relatório de Visualização Completo (Dificuldade ⭐⭐⭐)

PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# ============================================
# Exemplo abrangente: relatório de visualização
# de vendas de e-commerce com múltiplos gráficos
# ============================================

np.random.seed(42)
df = pd.DataFrame({
    'month': pd.date_range('2024-01', periods=12, freq='MS'),
    'Electronics': np.random.randint(3000, 8000, 12),
    'Clothing': np.random.randint(1000, 4000, 12),
    'Home': np.random.randint(500, 2500, 12),
    'Sports': np.random.randint(300, 1500, 12)
})
df = df.set_index('month')

# 1. Linha: tendência mensal
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

df.plot(ax=axes[0, 0], kind='line', title='Vendas Mensais por Categoria')
axes[0, 0].set_ylabel('Vendas ($)')

# 2. Barra: total por categoria
df.sum().plot(ax=axes[0, 1], kind='bar', title='Vendas Anuais por Categoria', color='steelblue')
axes[0, 1].set_ylabel('Vendas Totais ($)')

# 3. Pizza: participação de mercado
df.sum().plot(ax=axes[1, 0], kind='pie', autopct='%1.1f%%', title='Participação de Mercado')

# 4. Área: tendência cumulativa
df.plot(ax=axes[1, 1], kind='area', alpha=0.5, title='Tendência de Vendas Cumulativas')
axes[1, 1].set_ylabel('Vendas ($)')

plt.suptitle('Relatório de Vendas de E-Commerce 2024', fontsize=16)
plt.tight_layout()
# plt.savefig('sales_report.png', dpi=150, bbox_inches='tight')
print("Relatório com 4 gráficos criado!")
TEXT 📖 Somente leitura
> **Saída:** Execute isto em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado -- por favor, instale-o localmente (`pip install pandas`) e siga along. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.

❓ Perguntas Frequentes

P Qual é a relação entre o Pandas plot e o Matplotlib?
R df.plot é um wrapper de alto nível em torno do Matplotlib -- ele chama o matplotlib.pyplot nos bastidores e retorna um objeto Axes. Use df.plot para gráficos simples (uma linha resolve), e o Matplotlib para personalização complexa (comece com df.plot para o gráfico base, depois refine com métodos do Axes). Os dois funcionam perfeitamente juntos.
P Quais valores o parâmetro kind aceita?
R line (gráfico de linhas/padrão), bar (gráfico de barras), barh (barras horizontais), hist (histograma), box (box plot), kde/density (densidade kernel), area (gráfico de área), pie (gráfico de pizza), scatter (gráfico de dispersão), hexbin (binning hexagonal). Os mais comuns são: line/bar/hist/scatter.
P Como arranjo subplots?
R subplots=True dá a cada coluna seu próprio subplot, e layout=(linhas, colunas) especifica a grade. Por exemplo, layout=(2,2) cria uma grade 2x2. sharex/sharey=True compartilha eixos entre os subplots. Você também pode fazer manualmente: fig, axes = plt.subplots(2,2) e depois df.plot(ax=axes[0,0]) para posicionar gráficos em locais específicos.
P Como salvo um gráfico como imagem?
R Use plt.savefig('nome_arquivo.png', dpi=150, bbox_inches='tight'). O parâmetro dpi controla a resolução (150 = média, 300 = alta qualidade). bbox_inches='tight' evita que rótulos sejam cortados. Formatos suportados incluem png/jpg/svg/pdf. Não chame plt.show() antes de salvar (show limpa a figura).
P Como corrijo caracteres chineses bagunçados?
R Duas opções: (1) plt.rcParams['font.sans-serif'] = ['SimHei'] para definir uma fonte chinesa (Windows); (2) use inglês para títulos e rótulos (recomendado, evita problemas de compatibilidade de fontes). A opção 2 é mais universal -- funciona em múltiplas plataformas sem depender de arquivos de fonte.
P Como adiciono um mapeamento de cores a um gráfico de dispersão?
R Use o parâmetro c para especificar uma coluna de cor: df.plot(kind='scatter', x='price', y='rating', c='sales', cmap='viridis', colorbar=True). O parâmetro cmap define o mapa de cores (viridis/coolwarm/RdYlGn), e colorbar exibe a legenda. O parâmetro s controla o tamanho dos marcadores.
P Como sobreponho gráficos nos mesmos eixos?
R Use o parâmetro ax: ax1 = df1.plot() e depois df2.plot(ax=ax1). O segundo gráfico sobrepõe o primeiro, compartilhando os mesmos eixos. Isso é ótimo para comparar múltiplos conjuntos de dados. Defina label e legend para distingui-los.

📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Crie um DataFrame de vendas mensais e exiba-o usando gráficos de linha, barra e pizza. Compare como cada tipo de gráfico apresenta os mesmos dados.
  2. Intermediário (Dificuldade ⭐⭐): Crie um DataFrame com múltiplas colunas e use subplots=True para desenhar uma grade 2x2 de subplots (linha/barra/caixa/histograma). Adicione títulos e linhas de grade.
  3. Desafio (Dificuldade ⭐⭐⭐): Simule dados de vendas de 12 meses em 4 categorias de produtos. Crie um relatório com 4 gráficos: um gráfico de linha de tendência, um gráfico de barras anual, um gráfico de pizza de proporção e um gráfico de dispersão de preço vs. classificação. Salve o resultado como um arquivo PNG.

← Previous: Window Functions · Next: Performance Optimization →

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%