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 numericasdados_num <- CO2 |>select(conc, uptake) |>as.data.frame()# Calculando matriz de correlacaomat_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 projetotema_cafe <-theme_classic(base_size =13) +theme(# Titulosplot.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),# Eixosaxis.title =element_text(color ="#224573"),axis.text =element_text(color ="#444444"),axis.line =element_line(color ="#cccccc"),axis.ticks =element_line(color ="#cccccc"),# Legendalegend.position ="bottom",legend.title =element_text(color ="#224573", face ="bold"),legend.text =element_text(color ="#444444"),legend.key.size =unit(0.8, "lines"),# Facetasstrip.background =element_rect(fill ="#E5D3B3", color =NA),strip.text =element_text(color ="#224573", face ="bold"),# Gridpanel.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
---title: "Visualização avançada"---```{r setup, include=FALSE}knitr::opts_chunk$set(echo=TRUE, warning=FALSE, message=FALSE, fig.align="center", fig.width=9, fig.height=5.5)library(tidyverse)library(corrplot)library(knitr)cores_cafe <-c("#224573", "#6B4F4F", "#4A6FA5", "#E5D3B3")data("CO2")```## Princípios de visualização eficazUma 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::: callout-tip## Boas práticasDefina 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.:::## Gráfico de perfis individuaisRevela a trajetória de cada unidade experimental ao longo das condições. Indispensável para dados com medidas repetidas.```{r perfis}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")```## Heatmap de mediasRepresenta a intensidade de uma variável em função de dois fatores categóricos. Eficaz para comunicar padrões em dados multidimensionais.```{r heatmap}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))```## Grafico de barras com erro padrao```{r barras_ep}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")```## Grafico de densidade por grupo```{r densidade}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))```## Matriz de correlacao com corrplot```{r corrplot}# Selecionar variaveis numericasdados_num <- CO2 |>select(conc, uptake) |>as.data.frame()# Calculando matriz de correlacaomat_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))```## Violin plot com pontos individuaisCombina 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.```{r violin_jitter}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")```## Curva de resposta media por grupoMostra como a variavel resposta evolui com uma variavel contínua, separado por grupos. Permite identificar diferenças de padrão de resposta.```{r curva_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")```::: callout-note## ConceitoA 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.:::## Boas praticas de estilo```{r tema_personalizado, eval=FALSE}# Tema padrao do Cafe com R - reutilizavel em qualquer projetotema_cafe <-theme_classic(base_size =13) +theme(# Titulosplot.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),# Eixosaxis.title =element_text(color ="#224573"),axis.text =element_text(color ="#444444"),axis.line =element_line(color ="#cccccc"),axis.ticks =element_line(color ="#cccccc"),# Legendalegend.position ="bottom",legend.title =element_text(color ="#224573", face ="bold"),legend.text =element_text(color ="#444444"),legend.key.size =unit(0.8, "lines"),# Facetasstrip.background =element_rect(fill ="#E5D3B3", color =NA),strip.text =element_text(color ="#224573", face ="bold"),# Gridpanel.grid.major =element_line(color ="#eeeeee", linewidth =0.4),panel.grid.minor =element_blank())# Aplicar em qualquer grafico# ggplot(...) + geom_... + tema_cafe```::: callout-warning## 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:::