NT265/NE441 - Análise de dados e apresentação de gráficos usando a linguagem R
12 de novembro de 2025
https://github.com/mauriciovancine/workshop-r-data-visualization
Abram o script
script_r.R

tidyverse, possui uma sintaxe própria de camadas (layers)
Wilkinson (2005) Grammar of Graphics: representação gráfica dos dados a partir de atributos estéticos (do inglês aesthetic)

Wickham (2008) criou o pacote ggplot2, onde “gg” representa a contração de Grammar of Graphics

Por que usar paletas de cores
Tipos de paletas de cores
| Tipo | Uso | Exemplo |
|---|---|---|
| Categóricas | Categorias sem ordem | RColorBrewer::brewer.pal(3, "Set2") |
| Sequenciais | Dados ordenados (baixa → alta) | viridis::viridis(10) |
| Divergentes | Valores centrados em um ponto médio | RColorBrewer::brewer.pal(11, "RdBu") |
scico
ggplot2, mapas e gráficos acessíveis e consistentes

scico
ggplot2, mapas e gráficos acessíveis e consistentes

cols4all
Representações das colunas (eixos) e linhas (elementos)



Matthiopoulos (2011), Artwork by @allison_horst
Representa dados de uma coluna
Dados do tipo discreto ou contínuo
Distribuição de frequência ou densidade



graphics
graphics
graphics
graphics
graphics
graphics
graphics
par(mar = c(5, 5, 5, 5))
hist(penguins$flipper_length_mm,
col = "gray50",
border = "gray",
main = "Comprimento da nadadeira dos penguins",
xlab = "Comprimento da nadadeira (mm)",
ylab = "Densidade",
br = 50,
cex.main = 2,
cex.lab = 2,
cex.axis = 1.5,
prob = TRUE)
lines(density(na.omit(penguins$flipper_length_mm)))
graphics
par(mar = c(5, 5, 5, 5))
plot(density(na.omit(penguins$flipper_length_mm)),
col = "gray50",
main = "Comprimento da nadadeira dos penguins",
xlab = "Comprimento da nadadeira (mm)",
ylab = "Densidade",
cex.main = 2,
cex.lab = 2,
cex.axis = 1.5)
polygon(density(na.omit(penguins$flipper_length_mm)),
col = "gray50")
Exportar
par(mar = c(5, 5, 5, 5))
plot(density(na.omit(penguins$flipper_length_mm)),
col = "gray50",
main = "Comprimento da nadadeira dos penguins",
xlab = "Comprimento da nadadeira (mm)",
ylab = "Frequência",
cex.main = 2, cex.lab = 2, cex.axis = 1.5)
polygon(density(na.omit(penguins$flipper_length_mm)), col = "gray50")
ggplot2
ggplot2
ggplot2
ggplot2
ggplot2
ggplot2
ggplot2
ggplot2
ggplot(data = penguins,
aes(x = flipper_length_mm, fill = species)) +
geom_histogram(alpha = .5, position = "identity") +
scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
labs(title = "Comprimento da nadadeira dos penguins",
fill = "Espécies",
x = "Comprimento da nadadeira (mm)",
y = "Frequência") +
theme_bw(base_size = 20)
ggplot2
ggplot(data = penguins,
aes(x = flipper_length_mm, fill = species)) +
geom_histogram() +
scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
facet_wrap(~ species, ncol = 2, scale = "free_y") +
labs(title = "Comprimento da nadadeira dos penguins",
fill = "Espécies",
x = "Comprimento da nadadeira (mm)",
y = "Frequência") +
theme_bw(base_size = 20)
ggplot2
ggplot(data = penguins,
aes(x = flipper_length_mm, fill = species)) +
geom_histogram() +
scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
facet_grid(species ~ .) +
labs(title = "Comprimento da nadadeira dos penguins",
fill = "Espécies",
x = "Comprimento da nadadeira (mm)",
y = "Frequência") +
theme_bw(base_size = 20)
ggplot2
ggplot2
ggplot2
ggplot_densidade <- ggplot(data = penguins,
aes(x = flipper_length_mm, fill = species)) +
geom_density(alpha = .5) +
scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
labs(x = "Comprimento da nadadeira (mm)",
y = "Densidade",
fill = "Espécie") +
theme_bw(base_size = 20)
ggsave(filename = "density_ggplot2.png", plot = ggplot_densidade,
wi = 20, he = 15, un = "cm", dpi = 300)
system('open "density_ggplot2.png"')ggplot2
ggplot_densidade <- ggplot(data = penguins,
aes(x = flipper_length_mm, fill = species)) +
geom_density(alpha = .5) +
scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
labs(x = "Comprimento da nadadeira (mm)",
y = "Densidade",
fill = "Espécie") +
theme_bw(base_size = 20)
ggsave("density_ggplot2.pdf", plot = ggplot_densidade,
device = "pdf", wi = 20, he = 15, units = "cm")
system('open "density_ggplot2.pdf"')ggplot2
ggplot_densidade <- ggplot(data = penguins,
aes(x = flipper_length_mm, fill = species)) +
geom_density(alpha = .5) +
scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
labs(x = "Comprimento da nadadeira (mm)",
y = "Densidade",
fill = "Espécie") +
theme_bw(base_size = 20)
ggsave("density_ggplot2.svg", plot = ggplot_densidade,
wi = 20, he = 15, units = "cm")
system('open "density_ggplot2.svg"')
ggpubr
ggpubr
ggpubr
ggpubr_densidade <- ggdensity(data = penguins,
x = "flipper_length_mm",
add = "median",
color = "species",
fill = "species",
palette = c("darkorange", "darkorchid", "cyan4"),
xlab = "Comprimento da nadadeira (mm)",
ylab = "Densidade")
ggsave(filename = "densidade_ggpubr.png", plot = ggpubr_densidade,
wi = 20, he = 15, un = "cm", dpi = 300)ggpubr
ggpubr_densidade <- ggdensity(data = penguins,
x = "flipper_length_mm",
add = "median",
color = "species",
fill = "species",
palette = c("darkorange", "darkorchid", "cyan4"),
xlab = "Comprimento da nadadeira (mm)",
ylab = "Densidade")
ggsave("density_ggplot2.pdf", plot = ggplot_densidade,
device = "pdf", wi = 20, he = 15, units = "cm")
system('open "density_ggplot2.pdf"')ggpubr
ggpubr_densidade <- ggdensity(data = penguins,
x = "flipper_length_mm",
add = "median",
color = "species",
fill = "species",
palette = c("darkorange", "darkorchid", "cyan4"),
xlab = "Comprimento da nadadeira (mm)",
ylab = "Densidade")
ggsave(filename = "density_ggplot2.svg", plot = ggpubr_densidade,
wi = 20, he = 15, un = "cm")
system('open "density_ggplot2.svg"')Representa dados de uma coluna
Dados do tipo categórico
Proporção ou porcentagem de dados categóricos

graphic
graphic
ggplot2
ggplot(data = penguins_prop,
aes(x = "", y = prop, fill = species)) +
geom_bar(stat = "identity", color = "white") +
coord_polar("y", start = 0) +
geom_text(aes(label = paste0(prop, "%")), color = "white",
position = position_stack(vjust = .5), size = 8) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
theme_void() +
labs(fill = "Espécie")
ggpubr
Representa dados de uma coluna
Dados do tipo categórico
Proporção ou porcentagem de dados categóricos

ggplot
ggplot(data = penguins_prop, aes(x = 2, y = prop, fill = species)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y", start = 0) +
geom_text(aes(label = paste0(prop, "%")), color = "white",
position = position_stack(vjust = .5), size = 5) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
xlim(0, 2.5) +
theme_void() +
theme(legend.position = c(.5, .5),
legend.title = element_text(size = 20),
legend.text = element_text(size = 15)) +
labs(fill = "Espécie")
ggpubr
Representa dados de duas colunas
Dados do tipo categóricos: X = categórico e Y = categórico
Resume dados de contagens para uma coluna

Tabela de Frequência
graphics
ggplot2
ggplot(data = penguins_count,
aes(x = species, y = n, fill = species)) +
geom_bar(stat = "identity") +
geom_label(aes(label = n), fill = "white", size = 10) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
theme(legend.position = "none") +
labs(x = "Espécie",
y = "Número de indivíduos",
fill = "Espécie")
ggplot2
ggplot(data = penguins_count,
aes(x = species, y = n, fill = species)) +
geom_bar(stat = "identity") +
geom_label(aes(label = n), fill = "white", size = 10) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
coord_flip() +
theme_bw(base_size = 15) +
theme(legend.position = "none") +
labs(x = "Espécie",
y = "Número de indivíduos",
fill = "Espécie")
ggpubr
ggbarplot(penguins_count,
x = "species",
y = "n",
fill = "species",
color = "species",
palette = c("darkorange", "purple", "cyan4"),
label = TRUE,
lab.pos = "in",
lab.col = "white",
lab.size = 8,
main = "Número de indivíduos coletados por espécie",
xlab = "Espécies",
ylab = "Frequência absoluta",
legend = "none")
ggpubr
ggbarplot(penguins_count,
x = "species",
y = "n",
fill = "species",
color = "species",
palette = c("darkorange", "purple", "cyan4"),
label = TRUE,
lab.pos = "out",
lab.col = "black",
lab.size = 8,
main = "Número de indivíduos coletados por espécie",
xlab = "Espécies",
ylab = "Frequência absoluta",
legend = "none",
orientation = "horiz")
Gráfico dinamite (Dynamite plot)


Gráfico dinamite (Dynamite plot) - alternativas

Gráfico dinamite (Dynamite plot) - ggplot2
penguins_flipper_length_mn_sd <- penguins %>%
dplyr::group_by(species) %>%
dplyr::summarise(mean = mean(flipper_length_mm, na.rm = TRUE),
sd = sd(flipper_length_mm, na.rm = TRUE))
ggplot(data = penguins,
aes(x = species, y = flipper_length_mm, fill = species)) +
stat_summary(fun = mean,
geom = "col",
color = "black",
show.legend = FALSE) +
stat_summary(fun.data = mean_se,
geom = "errorbar",
width = 0.15,
linewidth = 0.8) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Species", y = "Flipper length (mm)")
Gráfico dinamite (Dynamite plot) - ggpubr
penguins_flipper_length_mn_sd <- penguins %>%
dplyr::group_by(species) %>%
dplyr::summarise(mean = mean(flipper_length_mm, na.rm = TRUE),
sd = sd(flipper_length_mm, na.rm = TRUE))
ggbarplot(penguins,
x = "species",
y = "flipper_length_mm",
fill = "species",
color = "gray30",
palette = c("darkorange", "purple", "cyan4"),
add = "mean_se",
add.params = list(size = 1),
main = "Tamanho médio da barbatana por espécie (desvio padrão)",
xlab = "Espécies",
ylab = "Frequência absoluta",
legend = "none")
Representa dados de duas colunas
Dados do tipo categóricos: X = categórico e Y = contínuo
Resume informações de medidas contínuas para dois ou mais fatores categóricos

Intervalo inter-quartil (interquartile range - IQR)
Limite inferior e limite superipor (1.5 x IQR)
Valores exteriores (outliers)

graphics
ggplot2
ggplot2
ggplot(data = penguins,
aes(x = species, y = flipper_length_mm, fill = species)) +
geom_boxplot(width = .3,
show.legend = FALSE) +
geom_jitter(alpha = .5,
show.legend = FALSE,
position = position_jitter(width = .1, seed = 0)) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Species", y = "Flipper length (mm)")
ggplot2
ggplot(data = penguins,
aes(x = species, y = flipper_length_mm, fill = species)) +
geom_violin(width = .3,
show.legend = FALSE) +
geom_jitter(alpha = .5,
show.legend = FALSE,
position = position_jitter(width = .1, seed = 0)) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(title = "Pontos com jitter", x = "Species", y = "Flipper length (mm)")
ggpubr
ggpubr
ggdist
Representa dados de duas colunas
Dados do tipo categóricos: X = contínuo e Y = contínuo
Plota a relação entre duas variáveis contínuas

graphics
ggplot2
ggplot(data = penguins,
aes(x = bill_length_mm,
y = bill_depth_mm,
color = species,
shape = species)) +
geom_point(size = 3, alpha = .8) +
scale_shape_manual(values = c(19, 15, 17)) +
scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Comprimento do bico (mm)",
y = "Profundidade do bico (mm)",
color = "Espécies", shape = "Espécies")
ggplot2
ggplot(data = penguins,
aes(x = bill_length_mm,
y = bill_depth_mm,
color = species,
shape = species)) +
geom_point(size = 3, alpha = .8) +
geom_smooth(method = "lm", se = FALSE) +
scale_shape_manual(values = c(19, 15, 17)) +
scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Comprimento do bico (mm)",
y = "Profundidade do bico (mm)",
color = "Espécies", shape = "Espécies")
Same Stats, Different Graphs: Generating Datasets with Varied Appearance and Identical Statistics through Simulated Annealing
Justin Matejka, George Fitzmaurice
ggplot2
ggplot2
ggpubr
ggpubr
ggpubr
ggpubr
Representa dados de duas colunas
Dados do tipo categóricos: X = contínuo e Y = contínuo
Plota a relação entre duas variáveis contínuas, mas para várias colunas

graphics
GGally
GGally
psych
Muitas vezes precisamos combinar gráficos para representar nossos dados
Essa tarefa pode ser realizada depois da criação dos gráficos em aplicativos como Inkskape ou GIMP
Outras vezes, podemos usar códigos e pacotes do R para fazer essa tarefa
graphics
par(mfrow = c(1, 2))
boxplot(flipper_length_mm ~ as.factor(species),
data = penguins,
col = c("darkorange", "purple", "cyan4"),
main = "Espécies por amostragens",
xlab = "Espécies",
ylab = "Comprimento da nadadeira (mm)",
cex.main = 1.5, cex.lab = 1.3, cex.axis = 1.2)
plot(bill_depth_mm ~ bill_length_mm,
data = penguins,
pch = 20,
cex = 1.5,
main = "Comprimento e profundidade do bico",
xlab = "Comprimento do bico (mm)",
ylab = "Profundidade do bico (mm)",
cex.lab = 1.5, cex.axis = 1.3)
graphics
par(mfrow = c(2, 1))
boxplot(flipper_length_mm ~ as.factor(species),
data = penguins,
col = c("darkorange", "purple", "cyan4"),
main = "Espécies por amostragens",
xlab = "Espécies",
ylab = "Comprimento da nadadeira (mm)",
cex.main = 1.5, cex.lab = 1.3, cex.axis = 1.2)
plot(bill_depth_mm ~ bill_length_mm,
data = penguins,
pch = 20,
cex = 1.5,
main = "Comprimento e profundidade do bico",
xlab = "Comprimento do bico (mm)",
ylab = "Profundidade do bico (mm)",
cex.lab = 1.5, cex.axis = 1.3)
ggplot2
ggplot_boxplot <- ggplot(data = penguins,
aes(x = species, y = flipper_length_mm, fill = species)) +
geom_boxplot(width = .3,
show.legend = FALSE) +
geom_jitter(alpha = .5,
show.legend = FALSE,
position = position_jitter(width = .1, seed = 0)) +
scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Species", y = "Flipper length (mm)")
ggplot_boxplot
ggplot2
ggplot_scatterplot <- ggplot(data = penguins,
aes(x = bill_length_mm,
y = bill_depth_mm,
color = species,
shape = species)) +
geom_point(size = 3, alpha = .8) +
scale_shape_manual(values = c(19, 15, 17)) +
scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Comprimento do bico (mm)",
y = "Profundidade do bico (mm)",
color = "Espécies", shape = "Espécies")
ggplot_scatterplot
cowplot
cowplot
patchwork
patchwork
gganimate
# pacote
# install.packages("gganimate")
library(gganimate)
plot_animate <- ggplot(data = penguins,
aes(x = bill_length_mm,
y = bill_depth_mm,
color = species)) +
geom_point() +
scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Comprimento do bico (mm)",
y = "Profundidade do bico (mm)",
color = "Espécies", shape = "Espécies") +
labs(title = "{closest_state}") +
transition_states(species) +
enter_grow() +
exit_fade()
plot_animate
gganimate
plotly
# pacote
# install.packages("plotly")
library(plotly)
plot_ly(data = penguins,
x = ~bill_length_mm,
y = ~bill_depth_mm,
type = "scatter",
color = ~species,
colors = c("darkorange", "purple", "cyan4")) %>%
layout(xaxis = list(title = "Comprimento do bico (mm)"),
yaxis = list(title = "Profundidade do bico (mm)"))plotly
plot_ly(data = penguins,
x = ~bill_length_mm,
y = ~bill_depth_mm,
z = ~body_mass_g,
type = "scatter3d",
color = ~species,
colors = c("darkorange", "purple", "cyan4")) %>%
layout(scene = list(xaxis = list(title = "Comprimento do bico (mm)"),
yaxis = list(title = "Profundidade do bico (mm)"),
zaxis = list(title = "Massa (g)")))plotly
plot_penguins_scatter_int <- ggplotly(
ggplot(data = penguins,
aes(x = bill_length_mm,
y = bill_depth_mm,
color = species,
shape = species)) +
geom_point(size = 3, alpha = .8) +
geom_smooth(method = "lm", se = FALSE) +
scale_shape_manual(values = c(19, 15, 17)) +
scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
theme_bw(base_size = 15) +
labs(x = "Comprimento do bico (mm)",
y = "Profundidade do bico (mm)",
color = "Espécies", shape = "Espécies"))
plot_penguins_scatter_intplotly
esquisse
esquisse - Shiny
Slides por Maurício Vancine, feitos com Quarto. Código disponível no GitHub.