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: 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:
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 objetosurvey
# 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 eixosx e y, cores e símbolos usados para plotar os dados.
#Carregando pacoteslibrary(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 mapeamentosurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo xy = 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.1geoms
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çãosurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao)) +#variável que será representada no eixo ygeom_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 transparentessurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao)) +#variável que será representada no eixo ygeom_point(color ="Red", #cor dos pontosalpha = .5, #opacidade dos pontossize =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 transparentessurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao)) +#variável que será representada no eixo ygeom_point(color ="Red", #cor dos pontosalpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =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 coressurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao, #variável que será representada no eixo ycolor = sexo)) +#variável que definirá as cores dos pontosgeom_point(alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =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.1Escalas
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 usadassurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao, #variável que será representada no eixo ycolor = sexo)) +#variável que definirá as cores dos pontosgeom_point(alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =2) +#espessura da retascale_x_continuous(breaks =seq(0, 60, 10)) +#valores que devem ser representados no eixo xscale_y_continuous(breaks =seq(0, 30, 5), #valores que devem ser representados no eixo ylabel = scales::dollar) +#especificando o formato da escala do eixo yscale_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 setorsurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao, #variável que será representada no eixo ycolor = sexo)) +#variável que definirá as cores dos pontosgeom_point(alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =2) +#espessura da retascale_x_continuous(breaks =seq(0, 60, 10)) +#valores que devem ser representados no eixo xscale_y_continuous(breaks =seq(0, 30, 5), #valores que devem ser representados no eixo ylabel = scales::dollar) +#especificando o formato da escala do eixo yscale_color_manual(values =c("Red", "Blue")) +#modificando as cores do gráficofacet_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 setorsurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao, #variável que será representada no eixo ycolor = sexo)) +#variável que definirá as cores dos pontosgeom_point(alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =2) +#espessura da retascale_x_continuous(breaks =seq(0, 60, 10)) +#valores que devem ser representados no eixo xscale_y_continuous(breaks =seq(0, 30, 5), #valores que devem ser representados no eixo ylabel = scales::dollar) +#especificando o formato da escala do eixo yscale_color_manual(values =c("Red", "Blue")) +#modificando as cores do gráficofacet_wrap(~setor) +#fatia o gráfico por setorlabs(title ="Relação entre remuneração e experiênica", #definindo o título do gráficosubtitle ="Dados de uma Survey Populacional", #definindo um subtítulo para o gráficocaption ="source: http://mosaic-web.org/",x =" Anos de experiência", #rótulo a ser apresentado no eixo xy ="Salário por hora", #rótulo a ser apresentado no eixo ycolor ="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 setorsurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao, #variável que será representada no eixo ycolor = sexo)) +#variável que definirá as cores dos pontosgeom_point(alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =2) +#espessura da retascale_x_continuous(breaks =seq(0, 60, 10)) +#valores que devem ser representados no eixo xscale_y_continuous(breaks =seq(0, 30, 5), #valores que devem ser representados no eixo ylabel = scales::dollar) +#especificando o formato da escala do eixo yscale_color_manual(values =c("Red", "Blue")) +#modificando as cores do gráficofacet_wrap(~setor) +#fatia o gráfico por setorlabs(title ="Relação entre remuneração e experiênica", #definindo o título do gráficosubtitle ="Dados de uma Survey Populacional", #definindo um subtítulo para o gráficocaption ="source: http://mosaic-web.org/",x =" Anos de experiência", #rótulo a ser apresentado no eixo xy ="Salário por hora", #rótulo a ser apresentado no eixo ycolor ="Gênero") +#rótulo a ser apresentado na legendatheme_minimal() #definindo o tema do gráfico
`geom_smooth()` using formula = 'y ~ x'
3.6As 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áficosurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao, #variável que será representada no eixo ycolor = sexo)) +#variável que definirá as cores dos pontosgeom_point(alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =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 mappingsurvey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao)) +#variável que será representada no eixo ygeom_point(mapping =aes(color = sexo), alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =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.7Grá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 objetosgraf1 = survey |>ggplot(mapping =aes(x = exper, #variável que será representada no eixo x y = remuneracao, #variável que será representada no eixo ycolor = sexo)) +#variável que definirá as cores dos pontosgeom_point(alpha = .5, #opacidade dos pontossize =2.5) +#tamanho dos pontosgeom_smooth(method ="lm", #especificando o método de ajuste da retase =FALSE, #indicando se deseja incluir um intervalo de confiançalinewidth =2) #espessura da reta#visualizando o gráficograf1
`geom_smooth()` using formula = 'y ~ x'
#Modificando os rótulosgraf1 +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 1graf1 +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?