Grupo Alliance Programa de Pós-Graduação em Psiquiatria e Ciências do Comportamento Universidade Federal do Rio Grande do Sul
8 de maio de 2023
Conteúdo de hoje
Pacote ggplot2
Gramática dos gráficos
Estética
Mapeamento
Gráficos básicos
Personalização de gráficos
Exemplos práticos
Extensões de ggplot2
Que a Força esteja com você!
Para a aula de hoje, vamos usar os dados_starwars.
Este conjunto de dados contém 14 variáveis de 87 personagens dos filmes da saga Star Wars.
No decorrer da aula, vamos introduzir outras bases de dados para exemplificar cada tipo de gráfico.
dados_starwars
library(dados)library(dplyr)dados_starwars
# A tibble: 87 × 14
nome altura massa cor_do_cabelo cor_da_pele cor_dos_olhos ano_nascimento
<chr> <int> <dbl> <chr> <chr> <chr> <dbl>
1 Luke Sky… 172 77 Loiro Branca cla… Azul 19
2 C-3PO 167 75 <NA> Ouro Amarelo 112
3 R2-D2 96 32 <NA> Branca, Az… Vermelho 33
4 Darth Va… 202 136 Nenhum Branca Amarelo 41.9
5 Leia Org… 150 49 Castanho Clara Castanho 19
6 Owen Lars 178 120 Castanho, Ci… Clara Azul 52
7 Beru Whi… 165 75 Castanho Clara Azul 47
8 R5-D4 97 32 <NA> Branca, Ve… Vermelho NA
9 Biggs Da… 183 84 Preto Clara Castanho 24
10 Obi-Wan … 182 77 Ruivo, Branco Branca cla… Azul acinzen… 57
# ℹ 77 more rows
# ℹ 7 more variables: sexo_biologico <chr>, genero <chr>, planeta_natal <chr>,
# especie <chr>, filmes <list>, veiculos <list>, naves_espaciais <list>
ggplot2
Exemplos iniciais de ggplot2
library(ggplot2)dados_starwars |>ggplot() +aes(x = massa, y = altura) +geom_point(color ="forestgreen", size =3) +xlab("Massa (kg)") +ylab("Altura (cm)") +ggtitle("Altura e massa dos personagens") +theme_bw(base_size =18)
dados_starwars |>filter(!is.na(genero)) |>ggplot() +aes(x = massa, y = altura, color = genero) +geom_point(size =4, alpha =0.7) +xlab("Massa (kg)") +ylab("Altura (cm)") +ggtitle("Altura e massa dos personagens","Estratificado por gênero") +theme_minimal(base_size =20) +scale_color_discrete(name ="Gênero")
Gramática de gráficos em camadas
O pacote ggplot2 segue duas filosofias que facilitam a compreensão do processo de construção de gráficos:
Um gráfico estatístico é uma representação visual dos dados por meio de atributos estéticos (posição, cor, forma, tamanho) de formas geométricas (pontos, linhas, curvas) (Wilkinson 2005)
Um gráfico pode ser construído em camadas (sobreposição de elementos visuais) (Wickham 2010)
Geralmente usado para visualizar a associação de duas variáveis contínuas.
Exemplo: verificar a associação entre altura e massa nos personagens do Star Wars.
# O código abaixo gera a figura do slidedados_starwars |>filter(massa <1000) |>ggplot() +aes(x = massa, y = altura) +geom_point()
1
Usar os dados_starwars
2
Manter apenas observações com menos de 1.000kg de massa
3
Iniciar o canvas do ggplot2
4
Mapear massa no eixo x e altura no eixo y
5
Adicionar geometria de pontos com geom_point()
ggplot2 é extremamente versátil
dados_gapminder
Para aprender o próximo gráfico, vamos usar os dados_gapminder.
Trata-se de um projeto sueco criado por Hans Rosling que coleta dados sobre diversas tendências globais. Na parte dos dados que vamos utilizar, temos informações de 1952 a 2007 (intervalos de 5 anos).
Estes dados possuem 1.704 observações e 6 variáveis, sendo elas: pais, continente, ano, expectativa_de_vida, populacao, pib_per_capita.
Utilizamos o geom_line() para fazer gráficos de linhas. Eles são ótimos para representar séries temporais, ou seja, observações medidas repetidamente em intervalos de tempo.
Tal qual no gráfico de pontos, precisamos definir as posições \(x\) e \(y\) para construirmos os gráficos de linhas.
No próximo slide, vamos olhar um exemplo de gráfico de linha do PIB per capita do Brasil ao decorrer dos anos.
dados_gapminder |>filter(pais =="Brasil") |>ggplot() +aes(x = ano, y = pib_per_capita) +geom_line(linewidth =2, color ="darkslateblue") +scale_x_continuous(breaks =seq(1952, 2007, 5)) +scale_y_continuous(labels = scales::dollar_format(prefix ="R$ ",decimal.mark =",",big.mark =".")) +labs(x ="Ano", y ="PIB per capita",title ="PIB per capita do Brasil ao passar dos anos",subtitle ="De 1952 a 2007",caption ="Fonte: Gapminder") +theme_minimal(base_size =16, base_family ="Charter")
Como os filmes da Pixar foram avaliados?
Para o próximo gráfico, vamos tentar responder a seguinte pergunta:
“Segundo a CinemaScore, qual a nota mais recebida pelos filmes da Pixar?”
Para isso, vamos usar outra base de dados do pacote dados, chamada pixar_avalicao_publico.
pixar_avalicao_publico
pixar_avalicao_publico
# A tibble: 24 × 5
filme nota_rotten_tomatoes nota_metacritic nota_cinema_score
<chr> <dbl> <dbl> <chr>
1 Toy Story - Um Mundo … 100 95 A
2 Vida de Inseto 92 77 A
3 Toy Story 2 100 88 A+
4 Monstros S. A. 96 79 A+
5 Procurando Nemo 99 90 A+
6 Os Incríveis 97 90 A+
7 Carros 74 73 A
8 Ratatouille 96 96 A
9 WALL-E 95 95 A
10 Up - Altas Aventuras 98 88 A+
# ℹ 14 more rows
# ℹ 1 more variable: nota_critics_choice <dbl>
pixar_avalicao_publico |>count(nota_cinema_score) # A função count() serve para contar os valores únicos de uma variável
# A tibble: 4 × 2
nota_cinema_score n
<chr> <int>
1 A 13
2 A+ 7
3 A- 2
4 <NA> 2
Gráfico de barras
O gráfico de barras é muito usado para apresentar a frequência de uma determinada categoria de uma variável.
No exemplo a seguir, acrescentamos o ggplot2 ao código do slide anterior para criar um gráfico de barras com a frequência de cada nota (A-, A, A+) dos filmes da Pixar segundo o CinemaScore.
Exemplo de gráfico de barras
# Este código gera o gráfico abaixopixar_avalicao_publico |>count(nota_cinema_score) |>ggplot() +aes(x = nota_cinema_score, y = n) +geom_col()
# O código abaixo gera o gráfico do painel ao ladopixar_avalicao_publico |>rename(nota = nota_cinema_score) |>count(nota) |>mutate(nota = forcats::fct_na_value_to_level(nota,"Sem escore"),nota =factor(nota,levels =c("A-", "A","A+","Sem escore")),cor = dplyr::case_when(nota =="A"~"Colorido",.default ="Cinza") ) |>ggplot() +aes(x = nota, y = n, fill = cor) +geom_col(width =0.5, show.legend =FALSE) +scale_fill_manual(values =c("gray25", "darkorange")) +labs(title ="A maioria dos filmes da Pixar (n = 13) receberam nota A.",x ="Nota segundo CinemaScore",y ="Número de filmes") +theme_classic(base_size =18, base_family ="Charter")
1
Pegar base da Pixar de avaliação do público
2
Renomear variável nota_cinema_score
3
Contar o número de filmes com cada nota
4
Transformar NA no valor “Sem escore”
5
Reordenar as notas da menor para a maior
6
Criar variável para colorir barra principal
7
Iniciar o canvas do ggplot2
8
Mapear variáveis do gráfico
9
Adicionar a geometria do gráfico de barras, retirar legenda e mudar largura das barras
10
Modificar as cores do preenchimento
11
Adicionar título e rótulos
12
Modificar tema, tamanho e família da fonte
Histograma
Histogramas são úteis para avaliarmos a distribuição de uma variável numérica.
Para criar histogramas, usamos o geom_histogram(). Para isso, precisamos apenas do atributo \(x\) (o eixo \(y\) é construído de forma automática).
Na sequência, podemos observar um exemplo de histograma das notas dos filmes da Pixar no Rotten Tomatoes.
pixar_avalicao_publico |>ggplot() +aes(x = nota_rotten_tomatoes) +geom_histogram(fill ="cyan4") +labs(x ="Nota segundo críticos do Rotten Tomatoes",y ="Contagem",title ="Como se distribuem as notas segundo os críticos do Rotten Tomatoes?",subtitle ="Dados de 24 filmes da Pixar",caption ="Fonte: Wikipedia") +theme_light(base_size =16, base_family ="Charter")
Box plot
Os box plots são úteis para estudar a distribuição de uma variável, especialmente ao comparar várias distribuições.
Para construir um box plot, usamos o geom_boxplot(). Para tal, usamos atributos \(x\) e \(y\), mapeando uma variável categórica para o atributo \(x\).
dados_gapminder |>filter(ano ==1952) |>ggplot() +aes(x = continente, y = expectativa_de_vida, color = continente) +geom_boxplot(show.legend =FALSE) +theme_classic(base_size =16, base_family ="Charter") +labs(x ="Continente", y ="Expectativa de vida (em anos)",title ="Como se distribuía a expectativa de vida em cada continente em 1952?",caption ="Fonte: Gapminder") +annotate("text", x =1, y =65,label ="Em 1952,\na África tinha\numa expectativa\nde vida\nde 38,8 anos.",size =5,family ="Charter")
Títulos, labels e escalas
Para colocar títulos ou trocar os labels (rótulos) dos atributos, utilizamos a função labs().
Para mudar as escalas (textos e quebras), usamos as funções da família scale_[estética]_[opção]().
Para definir qual porção do gráfico deve ser mostrada (limites), podemos usar as funções xlim() e ylim().
Cores
Para escolher manualmente as cores que coloriram ou preencheram um plot, use as funções scale_color_manual() ou scale_fill_manual().
Para trocar o nome das legendas geradas por atributos de cor, use as funções scale_color_discrete() ou scale_fill_discrete().
Temas
Como vocês devem ter percebido, o ggplot2 traz consigo alguns temas prontos a partir de funções da família theme_[estilo_do_tema].
Você também pode criar o seu próprio tema usando a função theme(). Não teremos como ver durante as aulas, pois requer um pouco mais de conhecimento técnico, mas é um processo divertido de aprender!
Dica: Extensões do ggplot2
O ggplot2 é muito potente, mas não possui todos os gráficos possíveis