Como adicionar geom_text ou geom_label com uma posição relativa ao tamanho de um geom_point?

Jan 20 2021

O que estou tentando fazer é adicionar um rótulo aos pontos feitos com geom_point que têm uma variável mapeada para o tamanho. O valor também é exibido no rótulo. O texto ou rótulo deve ser posicionado logo abaixo do geom_point, mas não parece possível conseguir isso com position_nudge

Meu código atualmente se parece com isto (simplificado):

ggplot(data, aes(x = var1, y = var2) +
   geom_point(aes(size = var3)) +
   geom_text(aes(label = var3))

O resultado é este

mas estou tentando alcançar algo assim:

Existe alguma maneira de conseguir isso de forma simples?

Obrigado.

EDIT: Estou tentando fazer com que a distância entre a borda do geom_point e a borda dos rótulos seja um valor fixo.

Respostas

1 tjebo Jan 21 2021 at 06:09

Espero que seja suficientemente diferente para merecer outra resposta. Eu admito que esqueci o que exatamente você queria para posicionar os rótulos. Então, basicamente, você não quer em relação ao centro do ponto, mas ao raio.

Senti-me nostalgicamente lembrado da minha primeira pergunta nesta comunidade , para a qual admito que não entendia a resposta há muito tempo.

A ideia básica é não usar geom_point , mas usar ggforce :: geom_circle (ou: geom_ellipse). Você pode usar o raio que você usa para a criação para o posicionamento de seus rótulos. Requer um pouco de codificação, mas tenho certeza de que haveria maneiras de definir programaticamente o raio com base em suas coordenadas gerais.

library(ggplot2)
library(ggforce)

foo <- data.frame(var1 = rep(1:3, 2),  var2 =rep(1:2, each = 3),
                   var3 = c(3, 10, 2, 1, 1, 10))
# Create cuts - you can also assign other values of course. factor of 0.01 was chosen randomly. 
foo$rad <- 0.01 * findInterval(foo$var3, 1:5)

ggplot(foo) +
  geom_circle(aes(x0 = var1, y0 = var2, r = rad),
              fill = "Grey50") +
  geom_text(aes(x = var1, y = var2 - rad - 0.03, label = var3)) +
  coord_equal()

Criado em 2021-01-20 pelo pacote reprex (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

O problema pode ser resolvido dimensionando sizee adicionando à vjustdistância aos pontos.

library(ggplot2)

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3, vjust = 1.5 + 0.1 * var3))

Dados de teste

data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))
2 tjebo Jan 21 2021 at 00:08

Usar nudge

Obrigado ao Rui pelos dados. +1

library(ggplot2)
data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3), nudge_y = -0.1 )

Criado em 2021-01-20 pelo pacote reprex (v0.3.0)