Anotações

Além de todas as brincadeiras, às vezes queremos destacar áreas específicas de um gráfico ou adicionar rótulos aos casos (com n pequeno), por exemplo.

Para isso, existem as funções geom_text() e annotate(), que podem ser usadas com ggplot. Vamos usar novamente o gráfico de dispersão do início, mas desta vez limitaremos o número para 15, para obter uma representação clara.

geom_jitter() não pode ser usado, pois os rótulos de dados aparecem no ponto de dados e não no ponto de dados jitterizado!

scatter2 <- ggplot(
  pss[1:15,], 
  aes(
    stfeco, 
    stfdem
  )
) +  
  geom_point(col = "blue") +
  scale_x_continuous(
    breaks = seq(
      0, 
      10,
      1
    )
  ) +
  scale_y_continuous(
    breaks = seq(
      0, 
      10, 
      1
    )
  )

scatter2

Com a função geom_text(), é possível adicionar rótulos aos pontos de dados. Por exemplo, o número da linha ou a variável de ID. Vamos usar a última opção, pois o número da linha pode mudar com as ordenações e, portanto, não é único. Portanto, agora adicionamos um label com a função aes (idno).```

scatter2 +
  geom_text(
    aes(label = idno)
  )

Dentro de geom_text(), agora podemos fazer mais ajustes. Alguns deles já conhecemos, dois outros importantes são nudge_y e nudge_x, que movem o início do texto no respectivo eixo.

scatter2 +
  geom_text(
    aes(label = idno),
    size = 2, 
    nudge_y = -.15
  )

Se ainda assim quisermos representar todos os pontos de dados e destacar apenas alguns pontos específicos, isso é muito fácil de fazer: queremos mostrar apenas os primeiros dez casos e, portanto, limitamos os dados em geom_text(). Isso também é possível usando subset() com várias condições.

ggplot(
  pss, 
  aes(
    stfeco, 
    stfdem
  )
) +  
  geom_point(
    alpha = .2, 
    col = "blue"
  ) +
  scale_x_continuous(
    breaks = seq(
      0, 
      10,
      1
    )
  ) +
  scale_y_continuous(
    breaks = seq(
      0, 
      10,
      1
    )
  ) +
  geom_text(
    aes(label = idno), 
    data = pss[1:10,]
  )
## Warning: Removed 96 rows containing missing values or values outside the scale range
## (`geom_point()`).

annotate() oferece possibilidades muito maiores. Com ela, não apenas podemos adicionar rótulos, mas também destacar áreas específicas dentro de um gráfico. Vamos usar novamente o gráfico com jitter e destacar uma área específica no gráfico:

scatter2 +
  annotate(
    "rect", 
    xmin = 6.5, # this corresponds to the axis scale!
    xmax = 8.5,
    ymin = 7.5,
    ymax = 10.5,
    colour = "darkgreen",
    fill = "lightgreen"
  )

A desvantagem é imediatamente evidente! Como o ggplot é abordado por camadas, o layer annotate() deve vir antes do layer geom_jitter(). Ou podemos adicionar alpha para alterar a visibilidade:

scatter2 +
  annotate(
    "rect", 
    xmin = 6.5,  
    xmax = 8.5,
    ymin = 7.5,
    ymax = 10.5,
    colour = "darkgreen",
    fill = "lightgreen",
    alpha = .1
  )

Agora queremos adicionar uma legenda ao gráfico para que o leitor saiba qual área estamos marcando aqui:

scatter2 +
  annotate(
    "rect", 
    xmin = 6.5,  
    xmax = 8.5,
    ymin = 7.5,
    ymax = 10.5,
    colour = "darkgreen",
    fill = "lightgreen",
    alpha = .1
  ) +
  annotate(
    "text", 
    x = 4, 
    y = 9, 
    label = "highlighted area", # with \n you get a new line
    colour = "darkgreen"
  ) 

Como outra opção, annotate() oferece a possibilidade de criar linhas, para que possamos apontar nosso texto para o campo:

scatter2 +
  annotate(
    "rect", 
    xmin = 6.5, 
    xmax = 8.5,
    ymin = 7.5,
    ymax = 10.5,
    colour = "darkgreen",
    fill = "lightgreen",
    alpha = .1
  ) +
  annotate(
    "text", 
    x = 4, 
    y = 9, 
    label = "highlighted area", # with \n you get a new line
    color = "darkgreen"
  ) +
  annotate(
    "segment", 
    x = 4.6,
    xend = 6.5, 
    y = 9, 
    yend = 9,
    color = "darkgreen",
    arrow = arrow()
  )

No último passo, você aprenderá a representar valores ausentes!