Tutorial 9: Visualização de Dados com ggplot I
Introdução: Visualização de Dados com ggplot2 II.
No tutorial anterior, aprendemos a parte obrigatória do ggplot2: definir seus dados, conectar variáveis a representações gráficas, e definir como mostrar seus dados usando as funções geoms
. Qualquer gráfico em ggplot2 terá estes três elementos.
Hoje, daremos um passo adiante. Aprenderemos como customizar nossos gráfico. Este processo de customização envolve diversas opções e diversos detalhes. Portanto, aqui não discutiremos a maior parte das opções disponíveis de customização no ggplot2.
Em meu caso, na maioria das vezes, eu uso o google quando preciso customizar algo nos meus gráficos. Uma opção interessante é o tutorial A ggplot2 Tutorial for Beautiful Plotting in R escrito por Cédric Scherer. A meu ver, este é um dos tutoriais mais detalhados e completos sobre opções de customização em ggpltot2.
Customização: Escalas + Labels + Temas.
A idéia de customização consiste em ajustar seu gráfico para apresentá-lo da forma mais efetiva possível. Este processo de decisões consiste em definir as cores que irá utilizar no gráfico, nomes dos eixos, background dos gráficos, posição de legendas, entre outros.
Começaremos com os ajustes de escalas (scale_function
).
Scales
As funções do tipo scale_function
controlam como você apresenta cada representação gráfica (aes) do seu gráfico. Por exemplo, estas funções permitem alterações nos eixos x
e y
, e nas outras representações como color
, fill
, shape
, entre outros.
Ajustando os eixos.
Os exemplos mais básicos das funções scale_
se referem aos eixos x
e y
. Alguns exemplos:
scale_x_log10
escale_y_log10
: converte um eixo númerico para escala de log.scale_y_reverse
escale_x_reverse
: inverte os valores de x e y.scale_x_continuous
escale_y_continous
: formata x e y quando são variáveis continuas.scale_x_discrete
escale_y_discrete
: formata x e y quando são variáveis discretas.scale_x_date
escale_y_date
: formata x e y quando são variáveis discretas.
Exemplos
Convertando o eixo x para log10 e alterando o nome.
library(gapminder)
library(tidyverse)
# Convertendo scale x para log.
ggplot(data=gapminder,
aes(y=lifeExp, x=gdpPercap)) +
geom_point() +
scale_x_log10(name="Log gdp")
Alterando intervalos em variável continua e alterando limites:
gapminder %>%
gap_grouped <- group_by(year, continent) %>%
summarise(m=mean(lifeExp, na.rm = TRUE))
ggplot(data=gap_grouped,
aes(y=m, x=year,
color=continent)) +
geom_point(size=3) +
geom_line() +
scale_x_continuous(breaks = unique(gap_grouped$year)) +
scale_y_continuous(limits = c(25,100))
Ajustando outras representações gráficas.
As funções scale são também muito úteis para ajustar outras representações gráficas, como fill
, color
, shape
, size
, entre outras. Alguns exemplos destas funções:
scale_aes_manual
: altera cores, shapes, fill para cada grupo de sua variável.scale_aes_gradient
: altera escalas de cores de forma continua.scale_aes_brewer
: altera palleta de cores para representação gráfica.
scale_aes_manual
ggplot(data=gap_grouped,
aes(y=m, x=year,
color=continent)) +
geom_point(size=3) +
geom_line() +
scale_x_continuous(breaks = unique(gap_grouped$year)) +
scale_y_continuous(limits = c(25,100)) +
scale_color_manual(name="Continent",
values = c("white", "blue", "red", "yellow", "green"))
Usualmente, não adicionamos as cores de forma manual. O R possui paletas de cores pensadas de forma cuidadosa para representar seus gráficas. Dentre elas, minha favorita é do pacote wesanderson
.
#devtools::install_github("karthik/wesanderson")
library(wesanderson)
< wes_palette("Royal2") pal
## Error in eval(expr, envir, enclos): object 'pal' not found
# Novo gráfico
ggplot(data=gap_grouped,
aes(y=m, x=year,
color=continent)) +
geom_point(size=3) +
geom_line() +
scale_x_continuous(breaks = unique(gap_grouped$year)) +
scale_y_continuous(limits = c(25,100)) +
scale_color_manual(name="Continent",
values = pal)
## Error in is_reference(x, quote(expr = )): object 'pal' not found
scale_aes_gradient
ggplot(data=gapminder,
aes(y=lifeExp, x=gdpPercap,
fill=lifeExp)) +
geom_point(shape=21, size=2) +
scale_x_log10() +
scale_fill_gradient(low="yellow", high="red",
name="Life Expectancy")
scale_aes_brewer
# Exemplo 1
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=continent,
fill=continent)) + # Etapa de Mapear
# Pontos
geom_boxplot(size=1.5,
alpha=.5) # Etapa do Geom
# Exemplo 2
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=continent,
fill=continent)) + # Etapa de Mapear
# Pontos
geom_boxplot(size=1.5,
alpha=.5) + # Etapa do Geom
scale_fill_brewer(palette = "Blues")
# Exemplo 3
ggplot(data=gapminder, ## Etapa dos Dados
aes(y=lifeExp, x=continent,
fill=continent)) + # Etapa de Mapear
geom_boxplot(size=1.5,
alpha=.5) + # Etapa do Geom
# fill
scale_fill_brewer(palette = "Set1")
Para ver todas as paletas disponíveis:
#install.packages("RColorBrewer")
library(RColorBrewer)
::display.brewer.all() RColorBrewer
Labels e Títulos
Ajustar os labels dos seus gráficos e títulos usando ggplot2 é super intuitivo. Como você pode imaginar, precisamos somente adicionar uma nova camada com a função labs()
ggplot(data=gapminder, aes(y=lifeExp, x=continent,
fill=continent)) + # Etapa de Mapear
geom_boxplot(size=1.5, alpha=.5) + # Etapa do Geom
scale_fill_brewer(palette = "Set1") +
# Nova camada
labs(
x = "Continentes",
y = "Expectativa de Vida",
fill = "Continente",
title = "Expectativa de Vida Por Continente",
subtitle = "Fonte: gapminder",
caption = " Author: Tiago Ventura"
)
Facetting.
O último truque do ggplot que é muito útil quando trabalhamos com dados agrupados são as funções facet_
.
Estas funções nos permitem dividir os gráficos em pequenas partes (sub-gráficos) a partir de determinados grupos.
Essas funções funcionam como formulas em R. O que vem depois do tilda ~
será dividido em pequenos gráficos. Vejamos alguns exemplos:
# Colunas
ggplot(data = gapminder, mapping = aes(x = year, y = gdpPercap)) +
geom_line(color="gray70", aes(group = country)) +
geom_smooth(size = 1.1, method = "loess", se = FALSE) +
scale_y_log10() +
labs(x = "Year",
y = "GDP per capita",
title = "GDP per capita on Five Continents") +
# facet
facet_wrap(~ continent)
Customização de forma consistente.
A maioria dos ajustes que você pode fazer em seu gráfico vão dentro da função theme
. Ao trabalhar em um projeto, é importante que seus gráficos sejam consistentes e que você adicione essa consistência ao seu fluxo de trabalho.
Isso significa que é fundamental que seus gráficos possuam a mesma identidade para o projeto inteiro. E essa consistência é fácil de ser mantida com o ggplot2.
Uma forma de ter gráficos consistentes é desenvolver seu própria tema e aplicar este mesmo tema a todos os seus gráficos. Abaixo segue um exemplo de um tema que desenvolvi para meus gráficos.
# Set up my theme ------------------------------------------------------------
"Palatino Linotype"
my_font <- "#f5f5f2"
my_bkgd <- RColorBrewer::brewer.pal(9, "Spectral")
pal <- theme(text = element_text(family = my_font, color = "#22211d"),
my_theme <-rect = element_rect(fill = my_bkgd),
plot.background = element_rect(fill = my_bkgd, color = NA),
panel.background = element_rect(fill = my_bkgd, color = NA),
panel.border = element_rect(color="black"),
strip.background = element_rect(color="black", fill="gray85"),
legend.background = element_rect(fill = my_bkgd, color = NA),
legend.key = element_rect(size = 6, fill = "white", colour = NA),
legend.key.size = unit(1, "cm"),
legend.text = element_text(size = 14, family = my_font),
legend.title = element_text(size=14),
plot.title = element_text(size = 22, face = "bold", family=my_font),
plot.subtitle = element_text(size=16, family=my_font),
axis.title= element_text(size=10),
axis.text = element_text(size=10, family=my_font),
axis.title.x = element_text(hjust=1),
strip.text = element_text(family = my_font, color = "#22211d",
size = 10, face="italic"))
theme_bw() + my_theme my_theme <-
A partir daí, você precisa dizer ao seu ambiente em R para utilizar este tema como modelo:
# This sets up for all your plots
theme_set(theme_bw() + my_theme)
Ou você pode fazer isto manualmente em cada gráfico:
ggplot(data=gapminder,
graph <-aes(y=lifeExp, x=continent,
fill=continent)) + # Etapa de Mapear
geom_boxplot(size=1.5, alpha=.5) + # Etapa do Geom
scale_fill_brewer(palette = "Set1")
+ my_theme graph
Outra opção, mais recomendada para quem está iniciando em R, é usar temas pré-construídos do ggplot2 e outros pacotes.
#install.packages(c("ggthemes", "hbrthemes"))
library(ggthemes)
library(hrbrthemes)
+
graph theme_minimal()
+
graph theme_economist()
+
graph theme_fivethirtyeight()
+
graph theme_ipsum()
Desafio (Valendo Ponto Extra).
Valendo ponto extra para o exercício da próxima semana. Eu compartilhei no slack alguns artigos que escrevi nos últimos anos usando ggplot. O desafio de vocês é escolher um gráfico favorito dentre estes artigos, e me mandar via slack. Na próxima aula, vamos reproduzir integralmente os gráficos que vocês escolherem.
E nesta semana não teremos exercício. Podem descansar!