Capítulo 7 ggplot2

A visualização exploratória de dados é talvez a maior vantagem do R. Com R pode-se rapidamente converter uma ideia em um gráfico, manipulando os dados com um balanço único entre flexibilidade e facilidade. Por exemplo, usar o Excel pode ser mais fácil do que o R para alguns gráficos, mas não é nem de longe tão flexível. D3.js pode ser mais flexível e poderoso que o R, mas leva muito mais tempo para gerar um gráfico.

Ao longo deste livro, criaremos gráficos usando o pacote ggplot225.

library(dplyr)
library(ggplot2)

Muitos muitos outros métodos para criar gráficas estão disponíveis no R. De fato, os recursos gráficos que vêm com uma instalação básica do R já são bastante poderosos. Também existem outros pacotes para criar gráficos como o grid e o lattice. Neste livro, decidimos usar o ggplot2 porque ele divide gráficos em componentes que permitem a iniciantes criar gráficos relativamente complexos e esteticamente agradáveis usando sintaxe intuitiva e relativamente fácil de lembrar.

Um dos motivos pelo qual ggplot2 é considerado mais intuitivo para iniciantes é o fato dele usar uma gramática gráfica26, o gg em ggplot2. Isso é análogo à forma como a aprender gramática pode ajudar um iniciante a criar centenas de diferentes frases apenas aprendendo um punhado de verbos, substantivos e adjetivos, em vez de memorizar cada frase específica. Da mesma forma, aprendendo uma pequena quantidade dos componentes básicos do ggplot2 e sua gramática, você poderá criar centenas de gráficos diferentes.

Outra razão pela qual ggplot2 é fácil para iniciantes é que seu comportamento padrão foi cuidadosamente escolhido para satisfazer a grande maioria dos casos e também é visualmente agradável. Como resultado, é possível criar gráficos informativos e elegantes com código relativamente simples e legível.

Uma limitação do ggplot2 é que ele foi projetado para funcionar exclusivamente com tabelas de dados no formato tidy (onde linhas são observações e colunas são variáveis). No entanto, uma porcentagem substancial dos datasets com os quais os iniciantes trabalham estão nesse formato ou podem ser convertidos para ele. Uma vantagem dessa abordagem é que, desde que nossos dados estejam “arrumados” (tidy em inglês), ggplot2 simplifica o aprendizado de código e gramática de plotagem para uma variedade de gráficos.

Para usar ggplot2, você terá que aprender uma série de funções e argumentos. Como é difícil memorizar, recomendamos que você tenha a folha de referência do ggplot2 à mão. Você pode obter uma cópia aqui: https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf ou simplesmente faça uma pesquisa na Internet por “ggplot2 cheat sheet.”

7.1 Os componentes de um gráfico

Construiremos um gráfico que resume o dataset de assassinatos por armas nos Estados Unidos da seguinte forma:

Podemos ver claramente o quanto os estados variam de acordo com o tamanho da população e o número total de assassinatos. Não é de surpreender que também exista uma relação clara entre o total de assassinatos e o tamanho da população. Estados plotados sobre a linha cinza tracejada têm a mesma taxa de homicídios que a média dos EUA. As quatro regiões geográficas são indicadas pelas cores (Northeast: nordeste; South: sul; North Central: central norte; West: oeste), o que mostra como a maioria dos estados do sul tem taxas de homicídio acima da média.

Essa visualização de dados mostra praticamente todas as informações na tabela de dados. Além disso, o código necessário para criar esse gráfico é relativamente simples. Vamos aprender a criá-lo parte por parte.

O primeiro passo para aprender ggplot2 é ser capaz de separar um gráfico em componentes. Começaremos examinando o gráfico acima e introduzindo algumas das terminologias do ggplot2. Os três principais componentes a serem considerados são:

  • Dados: A tabela de dados de assassinatos nos EUA está sendo resumida. Nós nos referimos a isso como o componente de dados (data).
  • Geometria: O gráfico acima é um diagrama de dispersão. Isso é chamado de componente de geometria (geometry). Outras geometrias possíveis são gráfico de barras (barplot), histograma, densidades suaves (smooth densities), gráfico Q-Q (qqplot) e diagrama de caixa (boxplot).
  • Mapeamento estético: o gráfico usa vários sinais visuais para representar as informações fornecidas pelo dataset. Os dois sinais mais importantes neste gráfico são as posições dos pontos nos eixos x e y, representando o tamanho da população e o número total de assassinatos, respectivamente. Cada ponto representa uma observação diferente. Assim, mapeamos os dados dessas observações para tais sinais visuais, como por exemplo, as escalas x e y. A cor é outro sinal visual que mapeamos para a região. Nós nos referimos a isso como o componente mapeamento estético (em inglês Aesthetic mapping). A definição do mapeamento depende de qual geometria estamos usando.

Também observamos que:

  • Os pontos são rotulados com as abreviações dos estado.
  • Os intervalos dos eixos x e y parecem ser definidos pelo intervalo dos dados. Ambos estão em escalas logarítmicas.
  • Existem rótulos, um título, uma lenda e usamos o estilo da revista “The Economist.”

Agora, vamos construir o gráfico parte por parte. Vamos começar carregando o dataset:

library(dslabs)
data(murders)

7.2 Objetos ggplot

A primeira etapa na criação de um gráfico ggplot2 é definir um objeto ggplot. Fazemos isso com a função ggplot, que inicializa o gráfico. Se lermos a página de ajuda dessa função, veremos que o primeiro argumento é usado para especificar quais dados estão associados a este objeto:

ggplot(data = murders)

Também podemos usar o operador pipe para inserir os dados como o primeiro argumento. Portanto, linha de código abaixo é equivalente à anterior:

murders %>% ggplot()

O código acima renderiza um quadro vazio, pois nenhuma geometria foi definida. A única opção de estilo que vemos é um fundo cinza.

O que aconteceu é que o objeto foi criado, mas por não ter sido atribuído a nenhuma variável, ele foi automaticamente executado. Podemos atribuir nosso gráfico a um objeto, por exemplo, desta forma:

p <- ggplot(data = murders)
class(p)
#> [1] "gg"     "ggplot"

Para renderizar o gráfico associado a esse objeto, podemos simplesmente imprimir o objeto p. Cada uma das duas linhas de código a seguir produz o mesmo gráfico que vemos acima:

print(p)
p

7.3 Geometrias

No ggplot2 criamos gráficos adicionando camadas (layers em inglês). As camadas podem definir geometrias, calcular estatísticas resumidas, definir quais escalas usar ou, até mesmo, alterar estilos. Para adicionar camadas, usamos o símbolo +. Em geral, uma linha de código ficará assim:

DADOS %>% ggplot() + CAMADA 1 + CAMADA 2 + … + CAMADA N

Geralmente, a primeira camada que adicionamos define a geometria. Por exemplo, se queremos fazer um diagrama de dispersão, qual geometria devemos usar?

Observando rapidamente a folha de referência, vemos que a função usada para criar gráficos com essa geometria é geom_point.

(Imagem cedida pelo RStudio27. Licença CC-BY-4.028.)

Os nomes das funções de geometrias seguem o padrão: geom_X, onde X é o nome da geometria. Alguns exemplos incluem geom_point, geom_bar e geom_histogram.

Para que geom_point funcione bem, precisamos fornecer dados e uma correspondência. Nós já conectamos o objeto p com tabela de dados murders. Se adicionarmos a camada geom_point, o padrão é usar os dados que foram conectados. Para descobrir quais correspondências são esperadas, leia a seção Aesthetics (estética) da página de ajuda de geom_point:

> Aesthetics (Estética)
>
> _geom_point_ entende a seguinte estética (estéticas obrigatórias estão em negrito):
>
> __x__
>
> __y__
>
> alpha
>
> colour

e, como esperado, vemos que pelo menos dois argumentos são necessários x e y.

7.4 Mapeamentos estéticos

Os __mapeamentos estéticos_ descrevem como as propriedades dos dados estão conectadas às características do gráfico, como a distância ao longo de um eixo, o tamanho ou a cor. A função aes conecta os dados com o que vemos no gráfico, definindo atribuições estéticas. Essa será uma das funções que mais serão usadas na representação gráfica. O resultado da função aes é frequentemente usado como argumento para uma função de geometria. Este exemplo produz um gráfico de dispersão do total de assassinatos versus população em milhões:

murders %>% ggplot() +
geom_point(aes(x = population/10^6, y = total))

Podemos remover o x = e y = se quiséssemos, uma vez que esses são os dois argumentos esperados, respectivamente, como visto na página de ajuda.

Em vez de definir nosso gráfico do zero, também podemos adicionar uma camada ao objeto p que foi definido anteriormente como p <- ggplot(data = murders):

p + geom_point(aes(population/10^6, total))

A escala e os rótulos são definidos por padrão ao adicionar essa camada. Assim como as funções dplyr, aes também usa os nomes de variáveis obtidos do componente do objeto: podemos usar population e total sem ter que chamá-los como assassinatos$population ou murders$total. O comportamento de reconhecer as variáveis de componentes de dados é bastante específico da função aes. Na maioria das funções, se você tentar acessar os valores de population ou total fora de aes, receberá uma mensagem de erro.

7.5 Camadas

Podemos criar uma segunda camada no gráfico para adicionar um rótulo a cada ponto para identificar o estado. As funções geom_label e geom_text nos permite adicionar texto ao gráfico com ou sem um retângulo atrás do texto, respectivamente.

Como cada ponto (cada estado neste caso) possui um rótulo, precisamos de um mapeamento estético para fazer a conexão entre pontos e rótulos. Lendo a página de ajuda, aprendemos que o mapeamento entre o ponto e o rótulo é fornecido através do argumento label da função aes. Portanto, o código fica assim:

p + geom_point(aes(population/10^6, total)) +
geom_text(aes(population/10^6, total, label = abb))

Adicionamos com sucesso uma segunda camada ao gráfico.

Como exemplo do comportamento único de aes mencionado acima, observe que esta chamada:

p_test <- p + geom_text(aes(population/10^6, total, label = abb))

funciona corretamente, enquanto esta chamada:

p_test <- p + geom_text(aes(population/10^6, total), label = abb)

dará um erro, uma vez que abb não foi encontrado por está fora da função aes. A camada geom_text não sabe onde encontrar abb porque é um nome de coluna e não uma variável global.

7.5.1 Trabalhando com argumentos

Cada função de geometria possui diversos outros argumentos além de aes e dados. Esses argumentos tendem a ser específicos para cada função. Por exemplo, no gráfico que desejamos fazer, os pontos são maiores que o tamanho padrão. No arquivo de ajuda, vemos que o argumento size (tamanho na tradução) é uma estética e podemos alterá-lo assim:

p + geom_point(aes(population/10^6, total), size = 3) +
geom_text(aes(population/10^6, total, label = abb))

size não é um mapeamento: enquanto os mapeamentos usam dados de observações específicas e precisam estar dentro da função aes(), as operações que afetam todos os pontos da mesma maneira não precisam ser incluídas dentro aes.

Agora, como os pontos ficaram maiores, se tornou difícil ver os rótulos. Se lermos a página de ajuda para geom_text, vemos que o argumento nudge_x move o texto levemente para a direita ou para a esquerda:

p + geom_point(aes(population/10^6, total), size = 3) +
geom_text(aes(population/10^6, total, label = abb), nudge_x = 1.5)

Isso é preferível, pois facilita a leitura do texto. Na seção 7.11 aprenderemos uma maneira melhor de garantir que possamos ver os pontos e os rótulos.

7.6 Mapeamento estético global versus local

Na linha de código anterior, definimos o mapeamento aes(population/10^6, total) duas vezes, uma vez em cada geometria. Podemos evitar isso usando um mapeamento estético global no momento em que definimos o objeto ggplot em branco. Lembre-se de que a função ggplot contém um argumento que nos permite definir mapeamentos estéticos:

args(ggplot)
#> function (data = NULL, mapping = aes(), ..., environment = parent.frame()) 
#> NULL

Se definirmos um mapeamento em ggplot, todas as geometrias adicionadas como camadas serão atribuídas por padrão a esse mapeamento. Redefinimos p:

p <- murders %>% ggplot(aes(population/10^6, total, label = abb))

e então podemos simplesmente escrever o código a seguir para produzir o gráfico anterior:

p + geom_point(size = 3) +
geom_text(nudge_x = 1.5)

Mantemos os argumentos size e nudge_x em geom_point e geom_text, respectivamente, porque queremos aumentar apenas o tamanho dos pontos e ajustar a posição (nudge em inglês) dos rótulos. Se colocarmos esses argumentos em aes, eles serão aplicados aos dois gráficos. Observe também que a função geom_point não precisa do argumento label e, portanto, ignora essa estética.

Se necessário, podemos substituir o mapeamento global definindo um novo mapeamento dentro de cada camada. Essas definições a nível local substituem as definições de nível global. Aqui está um exemplo:

p + geom_point(size = 3) +
geom_text(aes(x = 10, y = 800, label = "Olá!"))

Claramente, a segunda chamada para geom_text não usa population e total.

7.7 Escalas

Primeiro, as escalas que queremos estão em uma escala logarítmica. Esse não é o padrão, portanto, essa alteração precisa ser adicionada por meio de uma camada scale. Uma rápida olhada na folha de referência revela que a função scale_x_continuous nos permite controlar o comportamento das escalas. Usamos assim:

p + geom_point(size = 3) +
geom_text(nudge_x = 0.05) +
scale_x_continuous(trans = "log10") +
scale_y_continuous(trans = "log10")

Como agora estamos usando a escala logarítmica, o ajuste na posição (nudge) deve ser menor.

Essa transformação específica é tão comum que ggplot2 oferece duas funções especializadas scale_x_log10 e scale_y_log10, que podemos usar para reescrever o código assim:

p + geom_point(size = 3) +
geom_text(nudge_x = 0.05) +
scale_x_log10() +
scale_y_log10()

7.8 Rótulos e títulos

Da mesma forma, a folha de referência nos mostra que para alterar os rótulos e adicionar um título usamos as seguintes funções:

p + geom_point(size = 3) +
geom_text(nudge_x = 0.05) +
scale_x_log10() +
scale_y_log10() +
xlab("População em milhões (escala logarítmica)") +
ylab("Total de assassinatos (escala logarítmica)") +
ggtitle("Assassinatos por armas nos EUA em 2010")

Estamos quase terminando! O que precisamos fazer agora é adicionar cor, legenda e realizar algumas alterações opcionais no estilo.

7.9 Usando categorias como cores

Podemos mudar a cor dos pontos usando o argumento col na função geom_point. Para facilitar a demonstração de novos recursos, redefiniremos p para ser tudo, exceto a camada de pontos:

p <- murders %>% ggplot(aes(population/10^6, total, label = abb)) +
geom_text(nudge_x = 0.05) +
scale_x_log10() +
scale_y_log10() +
xlab("População em milhões (escala logarítmica)") +
ylab("Total de assassinatos (escala logarítmica)") +
ggtitle("Assassinatos por armas nos EUA em 2010")

a seguir, teste para ver o que acontece quando adicionamos chamadas diferentes a geom_point. Por exemplo, podemos deixar todos os pontos em azul adicionando o argumento color:

p + geom_point(size = 3, color ="blue")

Isso, é claro, não é o que queremos. Queremos atribuir cores de acordo com a região geográfica. Um bom comportamento padrão para ggplot2 é que, se atribuirmos uma variável categórica à cor, ela atribuirá automaticamente uma cor diferente a cada categoria, além de adicionar uma legenda.

Como a escolha da cor é determinada por uma característica de cada observação, isso é considerado um mapeamento estético. Logo, para atribuir uma cor a cada ponto, precisamos usar aes. Usamos o seguinte código:

p + geom_point(aes(col=region), size = 3)

Os mapeamentos x e y são herdados daqueles já definidos em p, portanto não é necessário rededfini-los. Nós também mudamos aes para o primeiro argumento, pois é aí que os mapeamentos são esperados nesta chamada de função.

Aqui está outro comportamento padrão útil: ggplot2 adiciona automaticamente uma legenda que atribui a cor à região. Para evitar adicionar essa legenda, configuramos geom_point com o argumento show.legend = FALSE.

7.10 Anotações, formas e ajustes

Muitas vezes, queremos adicionar formas ou anotações às figuras que não são derivadas diretamente do mapeamento estético; alguns exemplos incluem etiquetas, caixas, áreas sombreadas e linhas.

Aqui, queremos adicionar uma linha que represente a taxa média de homicídios em todo o país. Após determinar a taxa por milhão e armazená-la na variável \(r\), a linha será definida pela fórmula: \(y = r x\), sendo \(y\) e \(x\) nossos eixos: total de assassinatos e população em milhões, respectivamente. Na escala logarítmica, essa linha se torna: \(\log(y) = \log(r) + \log(x)\). Então, no nosso gráfico é uma linha com a inclinação 1 e intercepta \(\log(r)\). Para calcular esse valor, usamos nosso conhecimento de dplyr:

r <- murders %>%
summarize(rate = sum(total)/ sum(population) * 10^6) %>%
pull(rate)

Para adicionar uma linha, usamos a função geom_abline. ggplot2 usa ab no nome para nos lembrar de que estamos fornecendo a interceptação (a) e a inclinação (b). A linha padrão possui a inclinação 1 e intercepta 0, portanto, apenas precisamos definir a interceptação:

p + geom_point(aes(col=region), size = 3) +
geom_abline(intercept = log10(r))

Aqui, geom_abline não usa nenhuma informação do objeto de dados.

Podemos alterar o tipo de linha e a cor das linhas usando argumentos. Além disso, devemos desenhar a linha primeiro para que não cubra nossos pontos.

p <- p + geom_abline(intercept = log10(r), lty = 2, color = "darkgrey") +
geom_point(aes(col=region), size = 3)

Observe que redefinimos p e vamos usar esse novo p abaixo e na próxima seção.

Os gráficos padrão criados por ggplot2 já são muito úteis. No entanto, geralmente precisamos fazer pequenos ajustes no comportamento padrão. Embora nem sempre seja óbvio como fazer isso, mesmo com a folha de referência, ggplot2 é muito flexível.

Por exemplo, podemos fazer alterações na legenda através da função scale_color_discrete. Em nosso gráfico original, a palavra region está iniciada com letra maiúscula. Podemos alterá-la assim:

p <- p + scale_color_discrete(name = "Region")

7.11 Pacotes complementares

O poder do ggplot2 é aumentado ainda mais devido à disponibilidade de pacotes complementares (do inglês add-on packages). As alterações restantes necessárias para dar os retoques finais em nosso gráfico requerem os pacotes ggthemes e ggrepel.

O estilo de um gráfico ggplot2 pode ser alterado usando as funções theme. Diversos temas estão incluídos como parte do pacote ggplot2. De fato, para a maioria dos gráficos deste livro, usamos uma função do pacote dslabs que define automaticamente um tema padrão:

ds_theme_set()

O pacote ggthemes permite adicionar muitos outros temas, incluindo o tema theme_economist que nós escolhemos. Após a instalação do pacote, você pode alterar o estilo adicionando uma camada da seguinte forma:

library(ggthemes)
p + theme_economist()

Você pode ver como são os outros temas simplesmente alterando a função. Por exemplo, você pode testar o tema theme_fivethirtyeight() no lugar do anterior.

A diferença final tem a ver com a posição dos rótulos. No nosso gráfico, alguns dos rótulos se sobrepõem. O pacote de plug-ins ggrepel inclui uma geometria que adiciona rótulos garantindo que eles não se sobreponham. Para usá-lo, simplesmente mudamos geom_text para geom_text_repel.

7.12 Como combinar tudo

Agora que terminamos o teste, podemos escrever um código que produza o gráfico desejado do zero.

library(ggthemes)
library(ggrepel)

r <- murders %>%
summarize(rate = sum(total)/ sum(population) * 10^6) %>%
pull(rate)

murders %>% ggplot(aes(population/10^6, total, label = abb)) +
geom_abline(intercept = log10(r), lty = 2, color = "darkgrey") +
geom_point(aes(col=region), size = 3) +
geom_text_repel() +
scale_x_log10() +
scale_y_log10() +
xlab("População em milhões (escala logarítmica)") +
ylab("Total de assassinatos (escala logarítmica)") +
ggtitle("Assassinatos por armas nos EUA em 2010") +
scale_color_discrete(name = "Region") +
theme_economist()

7.13 Gráficos rápidos com qplot

Nós aprendemos poderosas técnicas para gerar visualizações com ggplot. No entanto, há casos em que precisamos apenas de um gráfico rápido, como por exemplo, um histograma dos valores em um vetor, um gráfico de dispersão dos valores em dois vetores ou um boxplot usando vetores categóricos e numéricos. Já demonstramos como gerar esses gráficos com hist, plot e boxplot. Entretanto, se queremos ser consistentes com o estilo ggplot, podemos usar a função qplot.

Se tivermos valores em dois vetores como:

data(murders)
x <- log10(murders$population)
y <- murders$total

e queremos fazer um diagrama de dispersão com ggplot, teríamos que escrever algo como:

data.frame(x = x, y = y) %>%
ggplot(aes(x, y)) +
geom_point()

Parece ser muito código para um gráfico tão simples. A função qplot sacrifica a flexibilidade oferecida pelo ggplot, mas permite gerar rapidamente um gráfico.

qplot(x, y)

Vamos aprender mais sobre qplot na seção 8.16

7.14 Grade de gráficos

Muitas vezes, temos que colocar gráficos próximos um do outro. O pacote gridExtra nos permite fazer isso:

library(gridExtra)
p1 <- qplot(x)
p2 <- qplot(x,y)
grid.arrange(p1, p2, ncol = 2)

7.15 Exercícios

Comece carregando os pacotes dplyr e ggplot2, bem como os dados murders e heights.

library(dplyr)
library(ggplot2)
library(dslabs)
data(heights)
data(murders)

1. Com ggplot2, os gráficos podem ser salvos como objetos. Por exemplo, podemos associar um conjunto de dados a um objeto gráfico da seguinte maneira:

p <- ggplot(data = murders)

Como data é o primeiro argumento, não precisamos declará-lo:

p <- ggplot(murders)

ou também podemos usar o pipe:

p <- murders %>% ggplot()

Qual é a classe do objeto p?

2. Lembre-se de que para imprimir um objeto, você pode usar o comando print ou apenas escrever o nome objeto. Imprima o objeto p definido no exercício 1 e descreva o que você vê.

  1. Nada acontece.
  2. Um gráfico em branco.
  3. Um diagrama de dispersão.
  4. Um histograma.

3. Usando o pipe %>%, crie um objeto p desta vez associado ao conjunto de dados heights em vez do conjunto de dados murders.

4. Qual é a classe do objeto p que você acabou de criar?

5. Agora vamos adicionar uma camada e os mapeamentos estéticos correspondentes. Para os dados de assassinatos, plote o total de assassinatos versus o tamanho da população. Explore o conjunto de dados murders para lembrar quais são os nomes dessas duas variáveis e escolha a resposta correta. Dica: use ?murders.

  1. state e abb
  2. total_murders e population_size
  3. total e population
  4. murders e size

6. Para criar um gráfico de dispersão, adicionamos uma camada com geom_point. O mapeamento estético requer que definamos as variáveis dos eixos x e y, respectivamente. Portanto, o código fica assim:

murders %>% ggplot(aes(x = , y = )) +
geom_point()

exceto que temos que definir as duas variáveis x e y. Preencha o espaço com os nomes corretos das variáveis.

7. Note que, se não usarmos nomes de argumentos, podemos obter o mesmo gráfico se inserirmos os nomes das variáveis na ordem correta, assim:

murders %>% ggplot(aes(population, total)) +
geom_point()

Refaça o gráfico, mas agora com total de assassnatos no eixo x e o tamanho da população no eixo y.

8. Se, em vez de pontos quisérmos adicionar textos, podemos usar as geometrias geom_text() ou geom_label(). O código a seguir:

murders %>% ggplot(aes(population, total)) + geom_label()

nos dará a mensagem de erro: Error: geom_label requires the following missing aesthetics: label (ou na tradução Erro: geom_label requer a seguinte estética ausente: label)

Por que isso acontece?

  1. Precisamos mapear caracteres para cada ponto através do argumento label em aes.
  2. Precisamos deixar geom_label saber quais caracteres usar no gráfico.
  3. A geometria geom_label não requer valores dos eixos x e y.
  4. geom_label não é um comando de ggplot2.

9. Reescreva o código acima para usar a abreviação como o rótulo através da função aes.

10. Mude a cor dos rótulos para azul. Como faremos isso?

  1. Adicionando uma coluna chamada blue em murders.
  2. Como cada etiqueta precisa de uma cor diferente, mapeamos as cores através aes.
  3. Usando o argumento color no ggplot.
  4. Como queremos que todas as cores sejam azuis, não precisamos atribuir cores, basta usar o argumento de cores em geom_label.

11. Reescreva o código acima para que os rótulos fiquem azuis.

12. Agora, suponha que desejemos usar cores para representar as diferentes regiões. Nesse caso, qual das seguintes opções é a mais apropriada?

  1. Adicione uma coluna chamada color em murders com a cor que queremos usar.
  2. Como cada tag precisa de uma cor diferente, mapeie as cores através do argumento de cores da função aes .
  3. Use o argumento color do ggplot.
  4. Como queremos que todas as cores sejam azuis, não precisamos atribuir cores, basta usar o argumento de cores em geom_label.

13. Reescreva o código acima para que a cor dos rótulos seja determinada pela região do estado.

14. Agora vamos mudar o eixo x para uma escala logarítmica para levar em conta o fato de que a distribuição da população é assimétrica. Vamos começar definindo um objeto p salvando o gráfico que criamos até agora:

p <- murders %>%
ggplot(aes(population, total, label = abb, color = region)) +
geom_label()

Para alterar o eixo y para uma escala logarítmica, aprendemos sobre a função scale_x_log10(). Adicione esta camada ao objeto p para alterar a escala e criar o gráfico.

15. Repita o exercício anterior, mas agora mude os dois eixos para que estejam na escala logarítmica.

16. Agora edite o código acima para adicionar o título “Dados de assassinatos por armas” ao argumento. Dica: use a função ggtitle.