alt text

GET00183 - Visualização de Dados

Jony Arrais Pinto Junior

1 - Introdução ggplot2

alt text

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

  • Gramática de gráficos consistente;
  • Especificação de plotagem em um alto nível de abstração;
  • Muito flexível;
  • Sistema de tema para polir a aparência do gráfico;
  • sistema gráfico completo e maduro;
  • Muitos usuários, lista de discussão ativa.

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

  • Gráficos tridimensionais (existem outros pacotes apropriados);
  • Gráficos de tipos de teoria de grafos (veja o pacote igraph, por exemplo);
  • Gráficos interativos (existem outros pacotes apropriados).

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:

  • dados;
  • mapeamento estético;
  • objeto geométrico;
  • transformações estatísticas;
  • escalas;
  • sistema de coordenadas;
  • ajustes de posição;
  • facetas;

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: Importe o arquivo survey85.csv e 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:

  • salário por hora em dólares (remuneracao);
  • número de anos de educação (educacao);
  • sexo;
  • é hispânico? (hispanico);
  • é do sul? (sul);
  • é casado? (casado);
  • tempo de experiência de trabalho (exper);
  • idade;
  • setor de trabalho (setor).
#Visualizando o objeto
survey
# A tibble: 533 x 10
   remuneracao educacao raca   sexo  hispanico sul   casado exper idade setor   
         <dbl>    <dbl> <chr>  <chr> <chr>     <chr> <chr>  <dbl> <dbl> <chr>   
 1        9          10 Branco M     N         N     S         27    43 constru…
 2        5.5        12 Branco M     N         N     S         20    38 vendas  
 3        3.8        12 Branco F     N         N     N          4    22 vendas  
 4       10.5        12 Branco F     N         N     S         29    47 adminis…
 5       15          12 Branco M     N         N     S         40    58 constru…
 6        9          16 Branco F     N         N     S         27    49 adminis…
 7        9.57       12 Branco F     N         N     S          5    23 servico 
 8       15          14 Branco M     N         N     N         22    42 vendas  
 9       11           8 Branco M     N         N     S         42    56 fabrica 
10        5          12 Branco F     N         N     S         14    32 vendas  
# … with 523 more rows

Suponha que o desejo seja entender visualmente a relação entre tempo de experiência e remuneração.

1.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)

# Especificando os dados e o mapeamento
survey |>
  ggplot(mapping = aes(x = exper, y = remuneracao))

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.

1.2 - 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, y = remuneracao)) + 
  geom_point()

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, y = remuneracao)) + 
  geom_point(color = "Red",
             alpha = .5,
             size = 2.5)

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 = \alpha + \beta x + \epsilon.\] Para desenharmos a reta com os valores de \(\alpha\) e \(\beta\) 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, y = remuneracao)) + 
  geom_point(color = "Red",
             alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2)

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

1.3 - 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, 
                       y = remuneracao,
                       color = sexo)) + 
  geom_point(alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2)

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?

1.4 - 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, 
                       y = remuneracao,
                       color = sexo)) + 
  geom_point(alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("Red", 
                                "Blue"))

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.

1.5 - 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, 
                       y = remuneracao,
                       color = sexo)) + 
  geom_point(alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("Red", 
                                "Blue")) +
    facet_wrap(~setor)

A visualização acima, ainda indica, que a diferença entre homens e mulheres na relação de experiência e remuneração, depende do setor.

1.6 - 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.

#modificando os rótulos do gráfico
survey |>
  ggplot(mapping = aes(x = exper, 
                       y = remuneracao,
                       color = sexo)) + 
  geom_point(alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("Red", 
                                "Blue")) +
    facet_wrap(~setor) +
  labs(title = "Relação entre remuneração e experiênica",
       subtitle = "Dados de uma Survey Populacional",
       caption = "source: http://mosaic-web.org/",
       x = " Anos de experiência",
       y = "Salário por hora",
       color = "Gênero")

1.7 - 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, 
                       y = remuneracao,
                       color = sexo)) + 
  geom_point(alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("Red", 
                                "Blue")) +
    facet_wrap(~setor) +
  labs(title = "Relação entre remuneração e experiênica",
       subtitle = "Dados de uma Survey Populacional",
       caption = "source: http://mosaic-web.org/",
       x = " Anos de experiência",
       y = "Salário por hora",
       color = "Gênero") +
  theme_classic()

1.2 - 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.

#reproduzindo o gráfico para cada tipo de setor
survey |>
  ggplot(mapping = aes(x = exper, 
                       y = remuneracao,
                       color = sexo)) + 
  geom_point(alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2) 

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

#reproduzindo o gráfico para cada tipo de setor
survey |>
  ggplot(mapping = aes(x = exper, 
                       y = remuneracao)) + 
  geom_point(aes(color = sexo),
             alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2) 

Perceberam a diferença do primeiro para o segundo gráfico? Quando o color é especificado no ggplot todos os geom subsequentes fazem a ação para cada sexo. Quando colocamos o color no geom_point ele só serve naquele geom, ou seja, ele plota os pontos com cores diferentes, mas não ajusta duas retas, pois o geom_smooth segue o mapeamento definido no ggplot.

1.3 - Gráfico como objeto

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

#armazenando o gráfico no objeto graf1
graf1 = survey |>
  ggplot(mapping = aes(x = exper, 
                       y = remuneracao)) + 
  geom_point(color = "Red",
             alpha = .5,
             size = 2.5) +
  geom_smooth(method = "lm",
              se = FALSE,
              size = 2) 

#visualizando o gráfico
graf1

#fazendo com que os pontos fiquem maiores e azul
graf1 +
  geom_point(color = "blue",
             size = 3)

#Modificando o tema do gráfico 1
graf1 +
  theme_minimal()