¿Cómo agregar geom_text o geom_label con una posición relativa al tamaño de un geom_point?
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
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)
El problema se puede resolver escalando size
y agregándolo a la vjust
distancia 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))
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)