5 gráficos para elevar suas apresentações
jenniferlopes.quarto.pub/portifolio
Os gráficos interativos com hover, animação e range slider funcionam apenas na versão HTML renderizada.
Esta aula foi construída para mostrar como transformar gráficos ggplot2 em interativos com o pacote plotly. Os dados usados são o dataset
gapminder, disponível no pacote de mesmo nome. Todo o código está funcional e pronto para reproduzir.
plotly adiciona em relação ao ggplot2 estáticoggplotly() para converter gráficos ggplot2 em interativosplot_ly() para construir gráficos com a API nativa do plotlyplotly é uma biblioteca de visualização interativa disponível para R, Python e JavaScript. No R, ela se integra diretamente ao ggplot2 através da função ggplotly().
Dois modos de uso:
ggplotly(): converte um objeto ggplot2 existente em interativoplot_ly(): API nativa com maior controle sobre interatividade| Característica | ggplotly() |
plot_ly() |
|---|---|---|
| Ponto de partida | Gráfico ggplot2 existente | Do zero |
| Curva de aprendizado | Baixa - sintaxe ggplot2 | Média - sintaxe própria |
| Controle de hover | Limitado | Total |
| Animação | Limitada | Nativa e completa |
| Quando usar | Migrar gráficos existentes | Gráficos novos com interatividade específica |
Rows: 1,704
Columns: 6
$ country <fct> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", …
$ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, …
$ year <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, …
$ lifeExp <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 40.8…
$ pop <int> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372, 12…
$ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.1134, …
| Variável | Tipo | Descrição |
|---|---|---|
country |
Fator | País (142 países) |
continent |
Fator | Continente (5 continentes) |
year |
Inteiro | Ano (1952 a 2007, a cada 5 anos) |
lifeExp |
Numérica | Expectativa de vida ao nascer (anos) |
pop |
Inteiro | População total |
gdpPercap |
Numérica | PIB per capita em dólares (ajustado pela inflação) |
O scatter plot estático mostra a relação entre duas variáveis contínuas. O que o plotly adiciona é o hover: ao passar o mouse sobre um ponto, uma caixa exibe as informações daquela observação.
O hover transforma o gráfico de uma imagem estática em uma ferramenta de consulta. O leitor pode investigar pontos de interesse sem precisar de uma tabela separada.
Com ggplotly(), o hover é gerado automaticamente a partir dos mapeamentos aes() do ggplot2. Com tooltip, você controla quais variáveis aparecem.
# Filtrar apenas o ano de 2007
gap_2007 <- gapminder |>
filter(year == 2007) |>
mutate(
# Criar texto personalizado para o hover
texto_hover = paste0(
"<b>", country, "</b><br>",
"Continente: ", continent, "<br>",
"Expectativa de vida: ", round(lifeExp, 1), " anos<br>",
"PIB per capita: US$ ", scales::comma(round(gdpPercap)), "<br>",
"População: ", scales::comma(pop)))
# Construir o gráfico ggplot2
p <- gap_2007 |>
ggplot(aes(
x = gdpPercap,
y = lifeExp,
color = continent,
text = texto_hover)) +
geom_point(aes(size = pop), alpha = 0.75) +
scale_x_log10(labels = scales::dollar_format()) +
scale_color_manual(values = paleta_continentes) +
scale_size_continuous(range = c(2, 14), guide = "none") +
labs(
title = "Expectativa de vida x PIB per capita (2007)",
x = "PIB per capita (escala log)",
y = "Expectativa de vida (anos)",
color = "Continente",
caption = "Jennifer Lopes | Café com R") +
tema
# Converter para interativo
ggplotly(p, tooltip = "text")O que o gráfico revela sobre 2007:
O boxplot estático mostra mediana, IQR e outliers. O plotly adiciona hover com valores exatos de cada estatística e legendas clicáveis que ocultam e revelam grupos.
Clicar duas vezes em um continente na legenda isola aquele grupo, ocultando todos os outros. Um clique simples oculta ou revela individualmente.
Isso transforma uma comparação estática entre cinco continentes em uma ferramenta de análise exploratória onde o leitor escolhe o que comparar.
gap_2007 <- gapminder |> filter(year == 2007)
plot_ly(
data = gap_2007,
x = ~continent,
y = ~lifeExp,
color = ~continent,
colors = paleta_continentes,
type = "box",
boxpoints = "all",
jitter = 0.3,
pointpos = 0,
marker = list(size = 4, opacity = 0.6),
hovertemplate = paste0(
"<b>%{x}</b><br>",
"Expectativa de vida: %{y:.1f} anos<br>",
"<extra></extra>")) |>
layout(
title = list(
text = "Distribuição da expectativa de vida por continente (2007)",
font = list(color = "#224573", size = 14)),
xaxis = list(title = ""),
yaxis = list(title = "Expectativa de vida (anos)"),
legend = list(title = list(text = "Continente")),
showlegend = TRUE)O que o gráfico revela:
boxpoints = "all" exibe cada observação individualmente, revelando que Oceania tem apenas dois países no datasetO gráfico de barras interativo permite que o leitor passe o mouse para ver valores exatos e clique na legenda para comparar continentes específicos sem a poluição visual de todos ao mesmo tempo.
Com plot_ly(), o argumento barmode controla se as barras são empilhadas ("stack"), agrupadas ("group") ou sobrepostas ("overlay"). Cada modo responde uma pergunta diferente sobre os dados.
# PIB per capita médio por continente e ano
gap_pib <- gapminder |>
group_by(continent, year) |>
summarise(
pib_medio = round(mean(gdpPercap), 0),
.groups = "drop")
plot_ly(
data = gap_pib,
x = ~year,
y = ~pib_medio,
color = ~continent,
colors = paleta_continentes,
type = "bar",
hovertemplate = paste0(
"<b>%{x}</b><br>",
"%{fullData.name}<br>",
"PIB per capita médio: US$ %{y:,.0f}<br>",
"<extra></extra>")) |>
layout(
barmode = "group",
title = list(
text = "PIB per capita médio por continente (1952-2007)",
font = list(color = "#224573", size = 14)),
xaxis = list(title = "Ano"),
yaxis = list(
title = "PIB per capita médio (US$)",
tickformat = ",.0f"),
legend = list(title = list(text = "Continente")))O que o gráfico revela:
O range slider é um seletor de período posicionado abaixo do gráfico principal. Ele permite que o leitor arraste os extremos para ampliar um período específico sem perder a referência do período completo.
É especialmente útil em séries temporais longas onde a variação em períodos específicos é difícil de visualizar na escala completa.
No plotly, o range slider é ativado com rangeslider = list(visible = TRUE) dentro do layout().
# Expectativa de vida média por continente e ano
gap_serie <- gapminder |>
group_by(continent, year) |>
summarise(
lifeExp_medio = round(mean(lifeExp), 1),
.groups = "drop")
plot_ly(
data = gap_serie,
x = ~year,
y = ~lifeExp_medio,
color = ~continent,
colors = paleta_continentes,
type = "scatter",
mode = "lines+markers",
hovertemplate = paste0(
"<b>%{fullData.name}</b><br>",
"Ano: %{x}<br>",
"Expectativa média: %{y:.1f} anos<br>",
"<extra></extra>")) |>
layout(
title = list(
text = "Expectativa de vida média por continente (1952-2007)",
font = list(color = "#224573", size = 14)),
xaxis = list(
title = "Ano",
rangeslider = list(visible = TRUE)),
yaxis = list(title = "Expectativa de vida média (anos)"),
legend = list(title = list(text = "Continente")),
hovermode = "x unified")O que o gráfico revela:
hovermode = "x unified" exibe os valores de todos os continentes simultaneamente ao passar o mouse sobre um ano, facilitando a comparação direta sem mover o cursor entre linhasO gráfico de bolhas animado é o formato popularizado por Hans Rosling nas apresentações do TED. Ele combina quatro variáveis simultâneas:
O argumento
framenoplot_ly()define qual variável controla a animação. O plotly gera automaticamente os controles de play, pause e seleção de frame.
gapminder |>
mutate(
texto_hover = paste0(
"<b>", country, "</b><br>",
"Continente: ", continent, "<br>",
"Expectativa de vida: ", round(lifeExp, 1), " anos<br>",
"PIB per capita: US$ ", scales::comma(round(gdpPercap)), "<br>",
"População: ", scales::comma(pop))) |>
plot_ly(
x = ~gdpPercap,
y = ~lifeExp,
size = ~pop,
color = ~continent,
frame = ~year,
text = ~texto_hover,
colors = paleta_continentes,
type = "scatter",
mode = "markers",
marker = list(opacity = 0.75, sizemode = "diameter"),
hovertemplate = "%{text}<extra></extra>") |>
layout(
title = list(
text = "Expectativa de vida x PIB per capita (1952-2007)",
font = list(color = "#224573", size = 14)),
xaxis = list(
title = "PIB per capita (US$)",
type = "log",
tickformat = ",.0f"),
yaxis = list(title = "Expectativa de vida (anos)"),
legend = list(title = list(text = "Continente"))) |>
animation_opts(
frame = 800,
transition = 500,
easing = "elastic") |>
animation_button(
x = 1, xanchor = "right",
y = 0, yanchor = "bottom")O que a animação revela:
animation_opts(easing = "elastic") adiciona um efeito de transição suave entre frames que torna a animação mais legível| Situação | Recomendação |
|---|---|
| Você já tem o gráfico pronto em ggplot2 | ggplotly() |
| Precisa de hover personalizado com HTML | plot_ly() |
Precisa de animação com frame |
plot_ly() |
| Precisa de range slider | plot_ly() |
Subplots com subplot() |
plot_ly() |
| Prototipagem rápida | ggplotly() |
Gráficos interativos têm custo: arquivo HTML maior, dependência de JavaScript e renderização mais lenta.
Use gráfico estático quando:
Use gráfico interativo quando:
Continue praticando e explorando!
Esta aula é parte do projeto Café com R. É open source. Use, compartilhe e adapte.
Que cada gole desperte uma nova ideia. Que cada script abra uma nova conversa. Que o Café com R se torne um ponto de encontro nosso.

Jennifer Lopes | Café com R