3  Introdução ao ggplot2


Hadley Wickham, junto com demais colaboradoes, criaram o ggplot2 com o intuíto de fornercer uma ferramenta capaz de fornecer um “modelo poderoso para a produção de gráficos complexos de múltiplas camadas”. Esta seção fornece uma breve visão geral de como o pacote ggplot2 funciona.

Vantagens do ggplot2

Dito isto, existem algumas coisas que você não pode (ou não deve) fazer com o ggplot2:

Qual é gramática dos gráficos?

Idéia básica: especificar separadamente blocos de construção de plotagem e combiná-los para criar qualquer tipo de exibição gráfica que você deseja.

Os blocos de construção de um gráfico incluem:

Para construirmos um gráfico usando o ggplot2, apenas as funções ggplot e os geoms são necessárias. As outras funções são opcionais e podem aparecer em qualquer ordem. Para discutirmos as funções que adicionam camadas, vamos importar uma base para exemplificarmos as funções do pacote.

Atividade: Crie um projeto chamado Graficos. Em seguida abra o Script Cap3 e no início do script faç a importação do arquivo survey85.csv. Armazene-o em um objeto chamado survey.

A base de dados possui variáveis referentes a uma pesquisa survey realizada em 1985 contendo remuneração e outras características de trabalhadores, tais como:

#Visualizando o objeto
survey
# A tibble: 533 × 10
   remuneracao educacao raca      sexo  hispanico sul   casado exper idade setor
         <dbl>    <dbl> <chr>     <chr> <chr>     <chr> <chr>  <dbl> <dbl> <chr>
 1        8.44       12 Branco    F     N         N     N          4    22 vend…
 2        5.72       12 Branco    F     N         N     S         29    47 admi…
 3        2.93       16 Branco    F     N         N     S         27    49 admi…
 4        8.34       12 Branco    F     N         N     S          5    23 serv…
 5        5.21       12 Branco    F     N         N     S         14    32 vend…
 6        9.07       17 Não Bran… F     N         N     S         32    55 admi…
 7        3.92       14 Branco    F     N         N     N         15    35 admi…
 8        4.27       12 Branco    F     N         N     S         38    56 serv…
 9        5.55       12 Branco    F     N         N     N          7    25 serv…
10        5.28       17 Branco    F     N         N     N          5    28 prof 
# ℹ 523 more rows

3.1 ggplot

A primeira função na construção de um gráfico é a função ggplot. O primeiro argumento é o data, onde você especifica o data frame com suas variáveis. Depois vem o mapping. Nele você cria o “mapeamento” para as propriedades visuais do gráfico, normalmente usando aes (de aesthetics), ou seja, você especifica entre várias coisas, por exemplo, quais são as variáveis dos eixos x e y, cores e símbolos usados para plotar os dados.

#Carregando pacotes
library(ggplot2)
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
# Especificando os dados e o mapeamento
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x
                       y = remuneracao)) #variável que será representada no eixo x

Observe que inicialmente informamos a base de dados. Após isso, especificamos o mapeamento do gráfico, ou seja, especificamos que gostaríamos de colocar a variável número de anos de experiência no eixo x e o remuneração por hora no eixo y. Mas por que mesmo depois de passarmos a base de dados e realizarmos o mapeamento do gráfico, ele está vazio???. Apesar de especificarmos os dados e o mapeamentos dos eixos, ainda não especificamos o que deveria ser plotado, isto é feito com a adição de mais uma camada, que iremos discutir a seguir.

3.1.1 geoms

Depois da função ggplot, nós especificamos um geom. Os geoms são objetos geométricos (tais como pontos, linhas, barras, etc.) que podem ser incluídos em um gráfico. Eles são adicionados usando funções que começam com geom_. No exemplo, vamos adicionar pontos usando a função geom_point, criando um gráfico de dispersão. Para a lista completa de geoms e todas as outras opções do pacote, visite a página do projeto ggplot2.

Na criação de gráficos com o ggplot2, as funções são encadeadas usando o sinal “+” para construirmos um gráfico final. No ggplot2, nós criamos gráficos em camadas (layers), e adicionamos camada a camada com um “+”.

#Gráfico de dispersão dos anos de experiência e da remuneração
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao)) + #variável que será representada no eixo y
  geom_point() #forma do gráfico

Podemos definir várias outras especificações (opcionais) em uma função geom_. Por exemplo, as opções para a função geom_point incluem cor, tamanho e alfa. Eles controlam a cor do ponto, o tamanho e a transparência, respectivamente. A transparência varia de 0 (totalmente transparente) a 1 (totalmente opaco). Adicionar um grau de transparência pode ajudar a visualizar pontos sobrepostos.

#Criando pontos vermelhos, maiores e semi transparentes
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao)) + #variável que será representada no eixo y
  geom_point(color = "Red", #cor dos pontos
             alpha = .5, #opacidade dos pontos
             size = 2.5) #tamanho dos pontos

Será que existe alguma relação entre as duas variáveis? Essa relação parace linear?`

Podemos ajustar uma modelo de regressão simples, isto é,

\[ y = \beta_0 + \beta_1 x + \epsilon \]

Para desenharmos a reta com os valores de \(\beta_0\) e \(\beta_1\) estimados, usamos o geom_smooth. As especificações do geom_smooth incluem o method, se e size.

#Criando pontos vermelhos, maiores e semi transparentes
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao)) + #variável que será representada no eixo y
  geom_point(color = "Red", #cor dos pontos
             alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) #espessura da reta
`geom_smooth()` using formula = 'y ~ x'

No method especificamos que a reta a ser desenhada é baseado no modelo de regressão linear simples \(y = \beta_0 + \beta_1 + \epsilon\), o se indica se um intervalo de confiança para a reta deve ser plotado e o linewidth controla a espessura da reta.

3.2 Agrupamentos

Além de mapearmos as variáveis que devem aparecer nos eixos x e y, também podemos usar variáveis para mapear cores, forma, tamanho e transparência e outras características visuais dos objetos geométricos no gráfico. Isto nos permite sobrepor grupos de observações em um mesmo gráfico. Vamos indicar qual é o sexo de cada ponto no gráfico.

#Indicando o sexo usando cores
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao, #variável que será representada no eixo y
                       color = sexo)) + #variável que definirá as cores dos pontos
  geom_point(alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) #espessura da reta
`geom_smooth()` using formula = 'y ~ x'

No exemplo acima, a opção color = sexo é incluída como argumento da função aes, porque estamos mapeando uma variável para uma estética.

O gráfico acima parece indicar que a relação de experiência e remuneração difere entre os sexos?

3.2.1 Escalas

Em geral, o ggplot2, como outros pacotes gráficos, fornece as escalas dos gráficos automaticamente. Entretanto, o controle sobre essas escalas é fundamental para uma melhor visualização.

As funções utilizadas para controlarmos as escalas dos elementos de um gráfico do ggplot2 seguem um padrão. Todas possuem nomes iniciados com scale_, depois o nome do elemento estético (color, fill, x, etc.) e, por fim, o tipo/nome da escala que será aplicada.

As especificações do scale_x_continuous e do scale_y_continuous incluem o breaks e label. No próximo gráfico, vamos alterar a escala dos eixos x e y e as cores empregadas.

#Modificando os eixos x e y e especificando as cores que serão usadas
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao, #variável que será representada no eixo y
                       color = sexo)) + #variável que definirá as cores dos pontos
  geom_point(alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) + #espessura da reta
  scale_x_continuous(breaks = seq(0, 60, 10)) + #valores que devem ser representados no eixo x
  scale_y_continuous(breaks = seq(0, 30, 5), #valores que devem ser representados no eixo y
                     label = scales::dollar) + #especificando o formato da escala do eixo y
  scale_color_manual(values = c("Red", 
                                "Blue")) #modificando as cores do gráfico
`geom_smooth()` using formula = 'y ~ x'

Como o nosso intuito era modificarmos as escalas dos eixos, x e y, e as variáveis exper e remuneracao são variáveis numéricas/contínuas, tivemos que usar as funções scale_x_continuous e scale_y_continuous. No argumento breaks indicamos que queríamos uma escala de 0 a 60 de 10 em 10, já no eixo y indicamos uma escala de 0 a 30 de 5 em 5 e pedimos que o rótulo do eixo y fosse apresentado em dólar.

Utilizamos a função scale_color_manual para modificarmos as cores do gráfico, umas vez que a variável sexo é categórica e o *argumento value foi especificado com duas cores, pois eram duas categorias.

3.3 Facets

Os facets reproduzem um gráfico para cada nível de uma determinada variável (ou combinação de variáveis). Os facets são criados usando funções que começam com facet_. Quando queremos criar os gráficos para todas as categorias de uma variável categórica, podemos usar o facet_wrap.

#reproduzindo o gráfico para cada tipo de setor
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao, #variável que será representada no eixo y
                       color = sexo)) + #variável que definirá as cores dos pontos
  geom_point(alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) + #espessura da reta
  scale_x_continuous(breaks = seq(0, 60, 10)) + #valores que devem ser representados no eixo x
  scale_y_continuous(breaks = seq(0, 30, 5), #valores que devem ser representados no eixo y
                     label = scales::dollar) + #especificando o formato da escala do eixo y
  scale_color_manual(values = c("Red", 
                                "Blue")) + #modificando as cores do gráfico
  facet_wrap(~setor) #fatia o gráfico por setor
`geom_smooth()` using formula = 'y ~ x'

Vocês diriam que a visualização acima indica que existe diferença entre homens e mulheres na relação de experiência e remuneração dependendo do setor?

3.4 Rótulos

Os gráficos devem ser fáceis de serem interpretados, para isso os rótulos devem ser bem informativos. A função do labs é fornecer rótulos personalizados para os eixos e legendas. Além disso, um título, subtítulo e legenda personalizados podem ser adicionados.

#reproduzindo o gráfico para cada tipo de setor
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao, #variável que será representada no eixo y
                       color = sexo)) + #variável que definirá as cores dos pontos
  geom_point(alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) + #espessura da reta
  scale_x_continuous(breaks = seq(0, 60, 10)) + #valores que devem ser representados no eixo x
  scale_y_continuous(breaks = seq(0, 30, 5), #valores que devem ser representados no eixo y
                     label = scales::dollar) + #especificando o formato da escala do eixo y
  scale_color_manual(values = c("Red", 
                                "Blue")) + #modificando as cores do gráfico
  facet_wrap(~setor) + #fatia o gráfico por setor
  labs(title = "Relação entre remuneração e experiênica", #definindo o título do gráfico
       subtitle = "Dados de uma Survey Populacional", #definindo um subtítulo para o gráfico
       caption = "source: http://mosaic-web.org/",
       x = " Anos de experiência", #rótulo a ser apresentado no eixo x
       y = "Salário por hora", #rótulo a ser apresentado no eixo y
       color = "Gênero") #rótulo a ser apresentado na legenda
`geom_smooth()` using formula = 'y ~ x'

3.5 Temas

Por último, podemos ajustar a aparência do gráfico usando temas prontos. As funções de themes (que começam com theme_) controlam entre outras coisas as cores de fundo, as fontes, as linhas de grade, as legenda e outros recursos do gráfico não relacionados aos dados. Vamos usar um tema mais limpo no último gráfico.

#reproduzindo o gráfico para cada tipo de setor
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao, #variável que será representada no eixo y
                       color = sexo)) + #variável que definirá as cores dos pontos
  geom_point(alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) + #espessura da reta
  scale_x_continuous(breaks = seq(0, 60, 10)) + #valores que devem ser representados no eixo x
  scale_y_continuous(breaks = seq(0, 30, 5), #valores que devem ser representados no eixo y
                     label = scales::dollar) + #especificando o formato da escala do eixo y
  scale_color_manual(values = c("Red", 
                                "Blue")) + #modificando as cores do gráfico
  facet_wrap(~setor) + #fatia o gráfico por setor
  labs(title = "Relação entre remuneração e experiênica", #definindo o título do gráfico
       subtitle = "Dados de uma Survey Populacional", #definindo um subtítulo para o gráfico
       caption = "source: http://mosaic-web.org/",
       x = " Anos de experiência", #rótulo a ser apresentado no eixo x
       y = "Salário por hora", #rótulo a ser apresentado no eixo y
       color = "Gênero") + #rótulo a ser apresentado na legenda
  theme_minimal() #definindo o tema do gráfico
`geom_smooth()` using formula = 'y ~ x'

3.6 As diferentes opções de lugares para se definir os dados e o mapeamento

Os gráficos criados com o ggplot2 sempre começam com a função ggplot. Em todos os exemplos acima, os dados e as opções de mapeamento foram colocados nesta função. Quando isso ocorre, eles se aplicam a cada função geom_ que for especificada a seguir.

É possível também incluir essas opções diretamente em um geom. Nesse caso, eles se aplicam apenas a esse geom específico. Isso pode ser muito útil em diversas situações.

Vamos considerar o gráfico a seguir.

#Definindo um único mapping para o gráfico
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao, #variável que será representada no eixo y
                       color = sexo)) + #variável que definirá as cores dos pontos
  geom_point(alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) #espessura da reta
`geom_smooth()` using formula = 'y ~ x'

Agora vamos retirar o color do aes definido no ggplot e vamos definir diretamente no geom_point.

#usando mais de um mapping
survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao)) + #variável que será representada no eixo y
  geom_point(mapping = aes(color = sexo), 
             alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) #espessura da reta
`geom_smooth()` using formula = 'y ~ x'

Perceberam a diferença do primeiro para o segundo gráfico? É possívei definirmos data e mapping para cada função usada no ggplot2. Quando não definimos, eles usam as informações, tanto do mapping como do data, definidos na função ggplot. Por exemplo, quando definimos um mapping no geom_point ele só serve para aquele geom, ou seja, ele plota os pontos com cores diferentes, mas o gráfico não ajusta duas retas, pois o geom_smooth segue o mapeamento definido no ggplot.

3.7 Gráfico como objeto

Um gráfico do ggplot2 pode ser armazenado em um objeto para ser manipulado posteriormente, ser salvo ou impresso.

#Tratando os gráficos como objetos
graf1 = survey |>
  ggplot(mapping = aes(x = exper, #variável que será representada no eixo x 
                       y = remuneracao, #variável que será representada no eixo y
                       color = sexo)) + #variável que definirá as cores dos pontos
  geom_point(alpha = .5, #opacidade dos pontos
             size = 2.5) + #tamanho dos pontos
  geom_smooth(method = "lm", #especificando o método de ajuste da reta
              se = FALSE, #indicando se deseja incluir um intervalo de confiança
              linewidth = 2) #espessura da reta

#visualizando o gráfico
graf1
`geom_smooth()` using formula = 'y ~ x'

#Modificando os rótulos
graf1 +
  labs(x = "Anos de experiência",
       y = "Salário por hora",
       color = "Gênero")
`geom_smooth()` using formula = 'y ~ x'

#Modificando o tema do gráfico 1
graf1 +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

3.8 Desafio

Com base no arquivo Base_ligacoes_roubos.txt faça o que se pede:

1.   Crie um gráfico de dispersão entre a data e o número de casos.

2.   Plote uma reta de regressão considerando todo o período.

3.   Plote uma reta de regressão para cada mês, isto é, uma reta considerando somente os dados de janeiro e outra para fevereiro.

4.   Existe outra forma de plotar as retas de regressão por mês?