Geração de gráficos

Testing phase Atividades: This section is currently being validated and may change.

Visualização é parte essencial da análise. Em Python, três bibliotecas dominam:

BibliotecaQuando usar
MatplotlibGráficos estáticos para relatórios (PDF, PNG). Maior controle visual.
Plotly ExpressGráficos interativos para notebooks e dashboards. Sintaxe enxuta.
SeabornEstatísticos prontos (boxplots, distribuições) sobre Matplotlib.

Pandas integra-se com todas via df.plot().

Matplotlib — o básico

import matplotlib.pyplot as plt

s = df["ano"].value_counts().sort_index()
s.plot(kind="bar")
plt.title("Notas à imprensa por ano")
plt.xlabel("Ano")
plt.ylabel("Quantidade")
plt.tight_layout()
plt.show()

Este bloco demonstra o uso da integração do Pandas com o Matplotlib para criar um gráfico de barras estático. O comando value_counts() organiza a frequência dos dados, enquanto o parâmetro kind=“bar” define o formato visual . É fundamental o uso de plt.tight_layout() para garantir que os rótulos não sejam cortados e plt.show() para renderizar a imagem final e limpar as descrições de objetos do console .

Tipos de gráfico via kind:

kindGráfico
"line"Linha (padrão)
"bar", "barh"Barras vertical/horizontal
"hist"Histograma
"box"Boxplot
"scatter"Dispersão (x e y obrigatórios)
"pie"Pizza

Salvar em arquivo em vez de mostrar:

s.plot(kind="bar")
plt.tight_layout()
plt.savefig("notas_por_ano.png", dpi=150)
plt.close()

Para exportar visualizações, utiliza-se a função plt.savefig(), especificando o nome do arquivo e a resolução (DPI) . Conforme as fontes, é crucial que este comando seja executado na mesma célula de código em que o gráfico foi gerado para que a captura da imagem ocorra corretamente antes do fechamento do processo com plt.close() .

Plotly Express — interativo

import plotly.express as px

s = df["ano"].value_counts().sort_index().reset_index()
s.columns = ["ano", "quantidade"]

fig = px.bar(s, x="ano", y="quantidade", title="Notas à imprensa por ano")
fig.show()

Diferente das bibliotecas estáticas, o Plotly gera gráficos que permitem interação direta, como dar zoom em áreas específicas e visualizar detalhes ao passar o mouse (hover) . O código transforma uma série do Pandas em um DataFrame com reset_index() para que o Plotly possa mapear as colunas “ano” e “quantidade” nos eixos X e Y de forma explícita .

Gráficos Plotly suportam zoom, hover e podem ser exportados como HTML:

fig.write_html("grafico.html")
fig.write_image("grafico.png")  # requer 'kaleido'

Os gráficos interativos do Plotly podem ser preservados em sua totalidade através da função fig.write_html() . Isso cria um arquivo independente que mantém todas as funcionalidades de zoom e tooltips em qualquer navegador, sendo uma alternativa superior ao salvamento estático quando a análise exige exploração de dados detalhados .

Caso real: notas do MRE por ano

A partir do DataFrame carregado em 01-04:

import pandas as pd
import plotly.express as px

# Converter coluna de string para datetime e extrair o ano
df["ano"] = pd.to_datetime(df["data"]).dt.year

# Contar e ordenar
contagem = df["ano"].value_counts().sort_index()

# Reformatar para Plotly
dados = contagem.reset_index()
dados.columns = ["ano", "quantidade"]

# Gráfico
fig = px.line(
    dados,
    x="ano",
    y="quantidade",
    title="Notas à imprensa do MRE por ano",
    markers=True,
)
fig.show()

Este exemplo foca no tratamento de dados temporais, convertendo strings em objetos de data com pd.to_datetime para extrair o componente do ano . O uso de px.line com o parâmetro markers=True facilita a identificação de pontos de dados específicos ao longo de uma série temporal, unindo a clareza da linha de tendência com a precisão dos pontos individuais .

Comparação entre categorias

# Notas que mencionam países do Mercosul
mercosul = ["Argentina", "Paraguai", "Uruguai", "Brasil"]

for pais in mercosul:
    df[f"menciona_{pais.lower()}"] = df["titulo"].str.contains(pais, case=False, na=False)

contagem = {pais: df[f"menciona_{pais.lower()}"].sum() for pais in mercosul}
fig = px.bar(
    x=list(contagem.keys()),
    y=list(contagem.values()),
    title="Menções a países do Mercosul nos títulos",
)
fig.show()

Aqui, a lógica de programação é aplicada para criar colunas booleanas que identificam a presença de termos específicos nos títulos através de str.contains. A soma dessas menções gera um dicionário de contagens que é alimentado diretamente no px.bar, permitindo comparar o volume de publicações entre diferentes categorias geográficas de forma clara e visual.

Histogramas e distribuições

df["tamanho_titulo"] = df["titulo"].str.len()

fig = px.histogram(df, x="tamanho_titulo", nbins=30, title="Tamanho dos títulos")
fig.show()

O uso de px.histogram é ideal para analisar a distribuição de frequências, como o comprimento de textos . O parâmetro nbins define a sensibilidade do agrupamento, permitindo observar se existe uma padronização ou anomalia na concentração dos dados, como a predominância de títulos curtos ou longos .

Múltiplos gráficos

Com Matplotlib, para colocar vários gráficos lado a lado:

fig, eixos = plt.subplots(1, 2, figsize=(12, 4))

df["ano"].value_counts().sort_index().plot(kind="bar", ax=eixos[0])
eixos[0].set_title("Notas por ano")

df["tamanho_titulo"].plot(kind="hist", bins=30, ax=eixos[1])
eixos[1].set_title("Distribuição de tamanhos de título")

plt.tight_layout()
plt.show()

Para criar painéis complexos, utiliza-se o comando plt.subplots(), que divide a área de desenho em uma grade definida por linhas e colunas . Cada gráfico é direcionado para um eixo específico através do parâmetro ax=eixos[n], permitindo que visualizações de naturezas diferentes (como um gráfico de barras e um histograma) sejam exibidas e comparadas lado a lado em uma única figura .

Boas práticas

  • Sempre dê título e legendas aos eixos — gráficos sem rótulos são inúteis fora do contexto imediato.
  • Ordene categorias quando faz sentido (anos crescentes, valores decrescentes).
  • Cuidado com escalas: barras truncadas em zero podem distorcer a percepção.
  • Para publicação acadêmica, prefira Matplotlib com tema configurado uma vez (plt.style.use("seaborn-v0_8-whitegrid")) e exporte em PDF ou SVG.
  • Para dashboards e exploração, Plotly Express é mais produtivo.