¿Cómo agregar geom_text o geom_label con una posición relativa al tamaño de un geom_point?

Jan 20 2021

Lo que estoy tratando de hacer es agregar una etiqueta a los puntos hechos con geom_point que tienen una variable asignada al tamaño. El valor también se muestra en la etiqueta. El texto o la etiqueta deben colocarse justo debajo de geom_point, pero no parece posible lograr esto con position_nudge.

Mi código actualmente se ve así (simplificado):

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

El resultado es este

pero estoy tratando de lograr algo como esto:

¿Hay alguna forma de conseguirlo de forma sencilla?

Gracias.

EDITAR: Estoy tratando de que la distancia entre el borde del geom_point y el borde de las etiquetas sea un valor fijo.

Respuestas

1 tjebo Jan 21 2021 at 06:09

Espero que esto sea lo suficientemente diferente como para merecer otra respuesta. Admito que he pasado por alto la parte de lo que exactamente querías colocar en las etiquetas. Entonces, básicamente, no lo desea en relación con el centro del punto, sino con el radio.

Me sentí bastante nostálgico recordando mi primera pregunta en esta comunidad , de la cual admito que no he entendido su respuesta durante mucho tiempo.

La idea básica es no usar geom_point , sino usar ggforce :: geom_circle (o: geom_ellipse). Puede utilizar el radio que utiliza para la creación para el posicionamiento de sus etiquetas. Requiere un poco de codificación rígida, pero estoy seguro de que habría formas de definir programáticamente el radio en función de sus coordenadas generales.

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()

Creado el 2021-01-20 por el paquete reprex (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

El problema se puede resolver escalando sizey agregándolo a la vjustdistancia a los puntos.

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))

Datos de prueba

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

Gracias a Rui por los datos. +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 )

Creado el 2021-01-20 por el paquete reprex (v0.3.0)