1_3

Author

Marcos Donizete de Moraes

1.3 Chamadas ggplot2

Utilizando pipes.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dados)
pinguins |> 
  ggplot(aes(
    x = comprimento_nadadeira,
    y = massa_corporal
  )) + geom_point()
Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

1.4 Visualizando distribuições

Variável categórica: assume apenas um valor de um conjunto pequeno de valores.

Melhor usar gráfico de barras para visualizar

library(tidyverse)
library(dados)
ggplot(pinguins,
  aes(
    x = fct_infreq(especie)
  )) + geom_bar()

Variável numérica (ou quantitatva): assume uma quantidade grande de valores e torna possível somar, dividir, subtrair e multiplicar esses valores.

Podem ser discretas ou contínuas. Geralmente são mostradas através do gráfco histograma.

pinguins |>
  ggplot(
    aes(
      x =  massa_corporal
    )
  ) + geom_histogram(binwidth = 200) +
  labs(caption = "Histograma da base de dados Pinguins")
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_bin()`).

Um histograma divide o eixo x em intervalos igualmente espaçados e, em seguida, usa a altura de uma barra para exibir o número de observações que se enquadram em cada intervalo. No gráfico acima, a barra mais alta mostra que 39 observações têm um valor massa_corporal entre 3500 e 3700 gramas, que são as bordas esquerda e direita da barra.

Gráfico de Densidade

Um gráfico de densidade é uma versão suavizada de um histograma e uma alternativa prática, especialmente para dados contínuos provenientes de uma distribuição suavizada subjacente.

Imagine um histograma feito de blocos de madeira. Em seguida, imagine que você jogue um fio de espaguete cozido sobre ele. A forma que o espaguete assumirá sobre os blocos pode ser considerada como a forma da curva de densidade. Ela mostra menos detalhes do que um histograma, mas pode facilitar a obtenção rápida da forma da distribuição, principalmente com relação à moda (valor que ocorre com maior frequência) e à assimetria.

ggplot(pinguins,
  aes(x = massa_corporal
  )
) + geom_density()
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_density()`).

Exercícios

  1. Faça um gráfico de barras de especie de pinguins, no qual você atribui especie ao atributo estético y. Como esse gráfico é diferente?
pinguins |>
  ggplot(
    aes(y = especie)
  ) + geom_bar()

  1. Como os dois gráficos a seguir são diferentes? Qual atributo estético, color ou fill, é mais útil para alterar a cor das barras?
pinguins |>
  ggplot(
    aes(x = especie)
  ) + geom_bar(color = "red")

pinguins |>
  ggplot(
    aes(x = especie)
  ) + geom_bar(fill = "red")

O argumento fill de geom_bar é mais útil para alterar as cores das barras pois o atributo color altera somente o contorno delas.

  1. O que o argumento bins em geom_histogram() faz?

Determina o número de barras no histograma. O default é 30.

  1. Faça um histograma da variável quilate no conjunto de dados diamante que está disponível quando você carrega o pacote dados. Faça experiências com diferentes larguras de intervalo (binwidth). Qual largura de intervalo revela os padrões mais interessantes?
ggplot(diamante,
       aes(x = quilate
       )) + geom_histogram(binwidth = 0.1)

1.5 Visualizando relações

1.5.1 Uma variável numérica e uma variável categórica

Para visualizar uma relação, precisamos ter pelo menos duas variáveis mapeadas para os atributos estéticos de um gráfico. Nas seções a seguir, você aprenderá sobre os gráficos comumente usados para visualizar relações entre duas ou mais variáveis e as geometrias usados para criá-los.

Para visualizar a relação entre uma variável numérica e uma variável categórica, podemos usar diagramas de caixa (chamados boxplots) lado a lado. Um boxplot é um tipo de abreviação visual para medidas de posição (percentis) que descrevem uma distribuição. Também é útil para identificar possíveis outliers.

ggplot(
  pinguins,
  aes(
    x = especie,
    y = massa_corporal
  )
) + geom_boxplot()
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_boxplot()`).

Gráfico de densidade

ggplot(
  pinguins,
  aes(
    x = massa_corporal,
    color = especie
  )
) + geom_density(linewidth = 0.75)
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_density()`).

O atributo linewidth faz com que as linhas se destaquem um pouco mais com relação ao fundo do gráfico.

Além disso, podemos mapear especie para os atributos estéticos color e fill e usar o atributo alpha para adicionar transparência às curvas de densidade preenchidas. Esse atributo assume valores entre 0 (completamente transparente) e 1 (completamente opaco). No gráfico a seguir, ela está definida como 0.5.

ggplot(
  pinguins,
  aes(
    x = massa_corporal, color = especie, fill = especie
  )
) + geom_density(alpha = 0.5)
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_density()`).

1.5.2 Usando duas variáveis categóricas

Podemos usar gráficos de barras empilhadas para visualizar a relação entre duas variáveis categóricas. Por exemplo, os dois gráficos de barras empilhadas a seguir exibem a relação entre ilha e espécie ou, especificamente, a visualização da distribuição de espécie em cada ilha.

O primeiro gráfico mostra as frequências de cada espécie de pinguim em cada ilha. O gráfico de frequências mostra que há um número igual de Pinguim-de-adélia em cada ilha. Mas não temos uma boa noção do equilíbrio percentual em cada ilha.

ggplot(
  pinguins,
  aes(x = ilha, fill = especie)
) + geom_bar()

O segundo gráfico é um gráfico de frequência relativa, criado pela definição de position = "fill" na geometria, que é mais útil para comparar as distribuições de espécies entre as ilhas, pois não é afetado pelo número desigual de pinguins entre as ilhas. Usando esse gráfico, podemos ver que todos os Pinguim-gentoo vivem na ilha Biscoe e constituem aproximadamente 75% dos pinguins dessa ilha, todos os Pinguim-de-barbicha vivem na ilha Dream e constituem aproximadamente 50% dos pinguins dessa ilha, e os Pinguim-de-adélia vivem nas três ilhas e constituem todos os pinguins da ilha Torgersen.

ggplot(
  pinguins,
  aes(x = ilha, fill = especie)
) + geom_bar(position = "fill")

Ao criar esses gráficos de barras, mapeamos a variável que será separada em barras para o atributo estético x e a variável que mudará as cores dentro das barras para a estética fill. Assim usamos duas variáveis, uma numérica e uma categórica.

1.5.3 Duas variáveis numéricas

O melhor gráfico para se trabalhar com duas variáveis numérica é o gráfico de dispersão (usando-se o geom_point e suavizando com o geom_smooth).

ggplot(
  pinguins,
  aes(
    x= comprimento_nadadeira,
    y = massa_corporal,
    color = especie,
    shape = ilha
  )
) + geom_point()
Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

1.5.4 Três ou mais variáveis

Podemos incorporar mais variáveis a um gráfica mapeando-as para aspectos estéticos adicinais. Ex.:

ggplot(
  pinguins,
  aes(
    x = comprimento_nadadeira,
    y = massa_corporal
  )
) + geom_point(
  aes(
    color = especie,
    shape = ilha
  )
)
Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

Porém, muitos atributos dificultam a visiblidade do gráfico. Uma solução para esse problema, principalmente com variáveis categóricas, é dividir o gráfico em facetas (janelas ou subdivisões que exibem um subconjunto dos dados de cada uma).

Para subdividir o gráfico por uma única faceta (neste caso usaremos a variável ilha) utiliza a função facet_wrap() (passando o nome da variável precedido de ~). Ex.:

ggplot(
  pinguins,
  aes(
    x = comprimento_nadadeira,
    y = massa_corporal
  )
) + geom_point(
  aes(
    color = especie,
    shape = ilha
  )
) + facet_wrap(~ilha)
Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

Exercícios

  1. O data frame milhas que acompanha o pacote dados contém observações 234 coletadas pela Agência de Proteção Ambiental dos EUA em modelos de 38 carros. Quais variáveis em milhas são categóricas? Quais variáveis são numéricas? (Dica: digite ?milhas para ler a documentação do conjunto de dados.) Como você pode ver essas informações ao executar milhas?

Para verificar quais variáveis são categórigas (assume apenas um valor em um pequeno conjunto de valores) e numéricas (ou quantitativa, podemos assumir uma ampla gama de valores numérios e também é possível realizar operações matemáticas com esses valores) podemos o seguinte comando:

glimpse(milhas)
Rows: 234
Columns: 11
$ fabricante  <chr> "audi", "audi", "audi", "audi", "audi", "audi", "audi", "a…
$ modelo      <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 quattro", "a…
$ cilindrada  <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0, 2.8…
$ ano         <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999, 2008…
$ cilindros   <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, 8…
$ transmissao <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)", "auto(…
$ tracao      <chr> "d", "d", "d", "d", "d", "d", "d", "4", "4", "4", "4", "4"…
$ cidade      <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 17, 15…
$ rodovia     <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 25, 25…
$ combustivel <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p"…
$ classe      <chr> "compacto", "compacto", "compacto", "compacto", "compacto"…

O comando mostra na frente de cada variável o tipo que ela ela (chr, int, dbl). Desta forma:

  • Variáveis categóricas: fabricante, modelo, transmissão, tração, combustível e classe.

  • Variáveis numéricas: cilindrada, ano, cilindros, cidade e rodovia.

Opcionalmente poderia-se também utilizar o comando ?milhas.

  1. Faça um gráfico de dispersão de rodovia (Milhas rodoviárias por galão) em função de cilindrada usando o data frame milhas. Em seguida, mapeie uma terceira variável numérica para color (cor), depois size (tamanho), depois igualmente para color e size e, por fim, shape (forma). Como esses atributos estéticos se comportam de forma diferente para variáveis categóricas e numéricas?
ggplot(
  milhas,
  aes(
    x = rodovia,
    y = cilindrada,
    color = cidade
  )
) + geom_point()

ggplot(
  milhas,
  aes(
    x = rodovia,
    y = cilindrada,
    size = cidade
  )
) + geom_point()

ggplot(
  milhas,
  aes(
    x = rodovia,
    y = cilindrada,
    color = cidade,
    size = cidade
  )
) + geom_point()

ggplot(
  milhas,
  aes(
    x = rodovia,
    y = cilindrada,
    color = cidade,
    size = cidade,
    shape = tracao
  )
) + geom_point()

  1. No gráfico de dispersão de rodovia vs. cilindrada, o que acontece se você mapear uma terceira variável para linewidth (espessura da linha)?
ggplot(
  milhas,
  aes(
    x = rodovia,
    y = cilindrada,
    linewidth = cidade
  )
) + geom_point()

Como não há linha para alterar a largura, nada acontece. O código roda como se essa estética não tivesse sido especificada.

  1. O que acontece se você mapear a mesma variável para várias atributos estéticos?

Quando se mapeia diversas variavéis para o mesmo padrão estético o resultado não é nada útil, conforme mostrado abaixo:

ggplot(
  milhas,
  aes(x = rodovia,
  y = rodovia,
  color = rodovia
)) + geom_point()

  1. Faça um gráfico de dispersão de profundidade_bico vs. comprimento_bico e pinte os pontos por especie. O que a adição da coloração por especie revela sobre a relação entre essas duas variáveis? E quanto à separação em facetas por especie?
ggplot(
  pinguins,
  aes(
    x = profundidade_bico,
    y = comprimento_bico,
    color = especie
  )
) + geom_point() + facet_wrap(~especie)
Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

Quando mudamos a aprecentação por facetas a forma de distribuição muda e causa dificuldade de visualização de alguns dados.

  1. Por que o seguinte código produz duas legendas separadas? Como você corrigiria isso para combinar as duas legendas?
ggplot(
  data = pinguins,
  mapping = aes(
    x = comprimento_bico, y = profundidade_bico, 
    color = especie, shape = especie
  )
) +
  geom_point() +
  labs(color = "Especies")
Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

O código fornecido no exercício produz duas legendas separadas porque a legenda para cor é renomeada para “Espécies”, mas a legenda para forma não é, e é chamada de “espécies” por padrão. Para consertar isso, precisaríamos renomear explicitamente a legenda de forma também.

ggplot(
  data = pinguins,
  mapping = aes(
    x = comprimento_bico, y = profundidade_bico, 
    color = especie, shape = especie
  )
) +
  geom_point() +
  labs(color = "Especies", shape = "Especies")
Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

  1. Crie os dois gráficos de barras empilhadas a seguir. Que pergunta você pode responder com o primeiro? Que pergunta você pode responder com o segundo?
ggplot(pinguins, 
       aes(
         x = ilha, fill = especie
      )
) + geom_bar(position = "fill")

ggplot(pinguins,
       aes(
         x = especie, fill = ilha
        )
) +   geom_bar(position = "fill")

Com o primeiro gráfico é possível verificar a distribuição dos pinguíns em cada ilha.

Com o segundo gráfico também é possível verificar essa distribuição mas de uma forma mais visualmente difícil.

1.6 Salvando seus gráficos