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.
1. What You Will Learn
- ❶ df.plot basics
- ❷ Chart types (line/bar/hist/box/scatter/pie/area/kde)
- ❸ subplots layout
- ❹ Style customization
- ❺ Saving and exporting
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 ⭐)
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!")
> **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
> **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 ⭐⭐)
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()
> **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
> **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 ⭐⭐)
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()
> **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
> **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 ⭐⭐)
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!")
> **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 |
7. Exemplo Completo: Relatório de Visualização de Vendas de E-Commerce
(4) ▶ Árvore de Decisão para Seleção de Gráficos
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]
> **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
> **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 ⭐⭐⭐)
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!")
> **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
fig, axes = plt.subplots(2,2) e depois df.plot(ax=axes[0,0]) para posicionar gráficos em locais específicos.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).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.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.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
df.plot(kind=...)cria um gráfico em uma linha, usando o Matplotlib por baixo dos panos- 8 tipos de gráficos: line (tendências) / bar (comparação) / hist (distribuição) / box (distribuição + outliers) / scatter (correlação) / pie (proporções) / area (cumulativo) / kde (densidade)
subplots=Truepara múltiplos subplots,layout=(r,c)para arranjo em grade- Personalização de estilo: style/color/figsize/title/grid/alpha/axhline
df.plotretorna um objeto Axes -- continue refinando com os métodos do Matplotlib- Salvamento:
plt.savefig(path, dpi, bbox_inches) - Estratégia: use
df.plotpara um rascunho rápido, depois Matplotlib para ajustar detalhes
📝 Exercícios
- 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.
- Intermediário (Dificuldade ⭐⭐): Crie um DataFrame com múltiplas colunas e use
subplots=Truepara desenhar uma grade 2x2 de subplots (linha/barra/caixa/histograma). Adicione títulos e linhas de grade. - 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 →