12  Visualização avançada

12.1 Princípios de visualização eficaz

Uma boa visualização comunica um insight claro com o mínimo de ruído visual. Os princípios fundamentais são:

  • Clareza: o leitor entende a mensagem sem precisar de explicação adicional
  • Honestidade: não distorce escala nem omite contexto relevante
  • Parcimônia: usa apenas elementos visuais que contribuem com informação
  • Consistência: mantém a mesma paleta, tipografia e estilo em todo o projeto
Boas práticas

Defina a mensagem principal antes de construir o gráfico. Pergunte: “O que quero que o leitor entenda em 5 segundos?” A resposta determina o tipo de gráfico, a variável destacada e o título.

12.2 Gráfico de perfis individuais

Revela a trajetória de cada unidade experimental ao longo das condições. Indispensável para dados com medidas repetidas.

ggplot(CO2, aes(x = conc, y = uptake, group = Plant)) +
  geom_line(aes(color = Type), alpha = 0.55, linewidth = 0.8) +
  geom_point(aes(color = Type), size = 1.6, alpha = 0.7) +
  facet_wrap(~Treatment,
             labeller = labeller(
               Treatment = c("nonchilled" = "Nao resfriada",
                             "chilled"    = "Resfriada"))) +
  scale_color_manual(values = c("#224573", "#6B4F4F"),
                     labels = c("Quebec", "Mississippi")) +
  labs(title    = "Perfis individuais de absorcao por planta",
       subtitle = "Cada linha representa uma planta individual",
       x     = "Concentracao de CO2 (mL/L)",
       y     = "Absorcao de CO2 (umol/m2s)",
           color = "Origem", caption = "Jennifer Lopes | Café com R") +
  theme_classic(base_size = 13) +
  theme(
    plot.title       = element_text(color = "#224573", face = "bold"),
    strip.background = element_rect(fill = "#E5D3B3", color = NA),
    strip.text       = element_text(color = "#224573", face = "bold"),
    legend.position  = "bottom")

12.3 Heatmap de medias

Representa a intensidade de uma variável em função de dois fatores categóricos. Eficaz para comunicar padrões em dados multidimensionais.

heatmap_data <- CO2 |>
  group_by(Type, Treatment, conc) |>
  summarise(Media = mean(uptake), .groups = "drop")

ggplot(heatmap_data,
       aes(x    = factor(conc),
           y    = interaction(Type, Treatment),
           fill = Media)) +
  geom_tile(color = "white", linewidth = 0.8) +
  geom_text(aes(label = round(Media, 1)),
            color = "white", size = 3.2, fontface = "bold") +
  scale_fill_gradient2(
    low      = "#E5D3B3",
    mid      = "#4A6FA5",
    high     = "#224573",
    midpoint = median(heatmap_data$Media)) +
  labs(title = "Heatmap: absorcao media de CO2 por grupo e concentracao",
       x     = "Concentracao de CO2 (mL/L)",
       y     = "Grupo (Origem.Tratamento)",
       fill  = "Absorcao\nmedia", caption = "Jennifer Lopes | Café com R") +
  theme_classic(base_size = 12) +
  theme(
    plot.title  = element_text(color = "#224573", face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1))

12.4 Grafico de barras com erro padrao

stats_plot <- CO2 |>
  group_by(Type, Treatment) |>
  summarise(
    Media = mean(uptake),
    EP    = sd(uptake) / sqrt(n()),
    .groups = "drop")

ggplot(stats_plot, aes(x = Type, y = Media, fill = Treatment)) +
  geom_col(position = position_dodge(width = 0.8),
           alpha = 0.85,
           color = "#224573",
           width = 0.65) +
  geom_errorbar(
    aes(ymin = Media - EP, ymax = Media + EP),
    position  = position_dodge(width = 0.8),
    width     = 0.22,
    linewidth = 0.9) +
  scale_fill_manual(values = c("#4A6FA5", "#E5D3B3"),
                    labels = c("Nao resfriada", "Resfriada")) +
  labs(title    = "Absorcao media por origem e tratamento",
       subtitle = "Barras de erro: mais ou menos erro padrao da media",
       x    = "Origem da planta",
       y    = "Absorcao media de CO2 (umol/m2s)",
       fill = "Tratamento", caption = "Jennifer Lopes | Café com R") +
  theme_classic(base_size = 13) +
  theme(
    plot.title      = element_text(color = "#224573", face = "bold"),
    legend.position = "bottom")

12.5 Grafico de densidade por grupo

ggplot(CO2, aes(x = uptake,
                fill  = interaction(Type, Treatment),
                color = interaction(Type, Treatment))) +
  geom_density(alpha = 0.45, linewidth = 0.8) +
  scale_fill_manual(
    values = c("#224573", "#4A6FA5", "#6B4F4F", "#E5D3B3"),
    labels = c("Quebec - Nao resfriada", "Quebec - Resfriada",
               "Mississippi - Nao resfriada", "Mississippi - Resfriada")) +
  scale_color_manual(
    values = c("#224573", "#4A6FA5", "#6B4F4F", "#C4A882"),
    labels = c("Quebec - Nao resfriada", "Quebec - Resfriada",
               "Mississippi - Nao resfriada", "Mississippi - Resfriada")) +
  labs(title = "Distribuicao de densidade por grupo experimental",
       x    = "Absorcao de CO2 (umol/m2s)",
       y    = "Densidade",
       fill  = "Grupo",
       color = "Grupo", caption = "Jennifer Lopes | Café com R") +
  theme_classic(base_size = 13) +
  theme(
    plot.title      = element_text(color = "#224573", face = "bold"),
    legend.position = "bottom",
    legend.text     = element_text(size = 9))

12.6 Matriz de correlacao com corrplot

# Selecionar variaveis numericas
dados_num <- CO2 |>
  select(conc, uptake) |>
  as.data.frame()

# Calculando matriz de correlacao
mat_cor <- cor(dados_num, method = "pearson")

corrplot(
  mat_cor,
  method   = "color",
  type     = "upper",
  addCoef.col = "white",
  tl.col   = "#224573",
  tl.srt   = 45,
  col      = colorRampPalette(c("#6B4F4F", "white", "#224573"))(200),
  title    = "Matriz de correlacao de Pearson",
  mar      = c(0, 0, 2, 0))

12.7 Violin plot com pontos individuais

Combina a distribuição (violin), o resumo (boxplot) e os dados brutos (jitter). É a visualização mais informativa para comparações de grupos com tamanho amostral moderado.

ggplot(CO2, aes(x = Type, y = uptake, fill = Type)) +
  geom_violin(alpha = 0.55, trim = FALSE, color = NA) +
  geom_boxplot(
    width         = 0.15,
    fill          = "white",
    alpha         = 0.9,
    outlier.shape = NA) +
  geom_jitter(
    aes(color = Type),
    width = 0.08,
    size  = 1.8,
    alpha = 0.6) +
  scale_fill_manual(values  = c("#224573", "#6B4F4F")) +
  scale_color_manual(values = c("#1a3558", "#4a3333")) +
  facet_wrap(~Treatment,
             labeller = labeller(
               Treatment = c("nonchilled" = "Nao resfriada",
                             "chilled"    = "Resfriada"))) +
  labs(title    = "Distribuicao completa: violin + boxplot + pontos",
       x = "Origem da planta",
       y = "Absorcao de CO2 (umol/m2s)", caption = "Jennifer Lopes | Café com R") +
  theme_classic(base_size = 13) +
  theme(
    plot.title       = element_text(color = "#224573", face = "bold"),
    strip.background = element_rect(fill = "#E5D3B3", color = NA),
    strip.text       = element_text(color = "#224573", face = "bold"),
    legend.position  = "none")

12.8 Curva de resposta media por grupo

Mostra como a variavel resposta evolui com uma variavel contínua, separado por grupos. Permite identificar diferenças de padrão de resposta.

medias_conc <- CO2 |>
  group_by(Type, Treatment, conc) |>
  summarise(
    Media = mean(uptake),
    EP    = sd(uptake) / sqrt(n()),
    .groups = "drop")

ggplot(medias_conc,
       aes(x = conc, y = Media,
           color = Type,
           linetype = Treatment,
           group = interaction(Type, Treatment))) +
  geom_ribbon(
    aes(ymin = Media - EP, ymax = Media + EP,
        fill = Type),
    alpha = 0.12, color = NA) +
  geom_line(linewidth = 1.3) +
  geom_point(size = 2.8) +
  scale_color_manual(values = c("#224573", "#6B4F4F")) +
  scale_fill_manual(values  = c("#224573", "#6B4F4F")) +
  scale_linetype_manual(
    values = c("nonchilled" = "solid", "chilled" = "dashed"),
    labels = c("Nao resfriada", "Resfriada")) +
  labs(
    title    = "Curva de resposta media por grupo experimental",
    subtitle = "Faixa: mais ou menos erro padrao da media",
    x        = "Concentracao de CO2 (mL/L)",
    y        = "Absorcao media de CO2 (umol/m2s)",
    color    = "Origem",
    fill     = "Origem",
    linetype = "Tratamento", caption = "Jennifer Lopes | Café com R") +
  theme_classic(base_size = 13) +
  theme(
    plot.title      = element_text(color = "#224573", face = "bold"),
    plot.subtitle   = element_text(color = "#6B4F4F"),
    legend.position = "bottom")

Conceito

A combinação de linha de media com faixa de erro padrao (ou intervalo de confiança) e pontos de dados brutos e a forma mais honesta de apresentar resultados experimentais com medidas repetidas. Ela comunica tendencia, variabilidade e dados individuais ao mesmo tempo.

12.9 Boas praticas de estilo

# Tema padrao do Cafe com R - reutilizavel em qualquer projeto
tema_cafe <- theme_classic(base_size = 13) +
  theme(
    # Titulos
    plot.title    = element_text(color = "#224573", face = "bold", size = 14),
    plot.subtitle = element_text(color = "#6B4F4F", size = 11),
    plot.caption  = element_text(color = "#888888", size = 9, hjust = 0),

    # Eixos
    axis.title  = element_text(color = "#224573"),
    axis.text   = element_text(color = "#444444"),
    axis.line   = element_line(color = "#cccccc"),
    axis.ticks  = element_line(color = "#cccccc"),

    # Legenda
    legend.position  = "bottom",
    legend.title     = element_text(color = "#224573", face = "bold"),
    legend.text      = element_text(color = "#444444"),
    legend.key.size  = unit(0.8, "lines"),

    # Facetas
    strip.background = element_rect(fill = "#E5D3B3", color = NA),
    strip.text       = element_text(color = "#224573", face = "bold"),

    # Grid
    panel.grid.major = element_line(color = "#eeeeee", linewidth = 0.4),
    panel.grid.minor = element_blank())

# Aplicar em qualquer grafico
# ggplot(...) + geom_... + tema_cafe
Atencao - erros comuns em visualizacao
  • Eixo Y iniciando em valor diferente de zero em grafico de barras: distorce a percepcao da diferenca entre grupos
  • Excesso de cores sem significado: use cores apenas para distinguir grupos ou representar uma variavel
  • Titulos vagos como “Grafico 1”: o titulo deve comunicar a conclusao principal
  • Ausencia de unidades nos eixos: sempre inclua a unidade de medida
  • Pie charts para mais de 3 categorias: use grafico de barras horizontais