Como adicionar geom_text ou geom_label com uma posição relativa ao tamanho de um geom_point?
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
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)
O problema pode ser resolvido dimensionando size
e adicionando à vjust
distâ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))
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)