¿Cómo puedo obtener las coordenadas x , y de un geom_point en un ggplot , donde el marco de referencia es la imagen trazada completa?
Puedo crear un ggplot con algunos geom_point s usando:
library(ggplot2)
my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
geom_point(aes(x, y), color = "red")
Esto da:
Al convertir esto en un grob , puedo extraer información adicional sobre este ggplot , como las coordenadas con respecto al panel de trazado, marcado por la flecha púrpura. Sin embargo, esto ignora el espacio ocupado por los ejes.
my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native
¿Cómo puedo obtener los valores de las coordenadas x , y cuando comienzo a medir desde la esquina inferior izquierda de toda la imagen, marcada con la flecha verde?
Si es posible, me gustaría que la solución tenga en cuenta el tema de ggplot . Agregar un tema como + theme_void()
afecta a los ejes y también cambia la ubicación de los puntos con respecto a toda la imagen trazada.
Actualización : me di cuenta de que el tamaño de fuente de los ejes cambia según el ancho y la altura de la gráfica, lo que afecta el tamaño relativo del panel de la gráfica . Por lo tanto, no será trivial proporcionar la ubicación en unidades npc sin definir el ancho y la altura del gráfico . Si es posible, proporcione la ubicación de los geom_points en función del ancho y la altura del gráfico .
Respuestas:
Cuando cambia el tamaño de un ggplot, la posición de los elementos dentro del panel no está en posiciones fijas en el espacio npc. Esto se debe a que algunos de los componentes de la trama tienen tamaños fijos, y algunos de ellos (por ejemplo, el panel) cambian las dimensiones de acuerdo con el tamaño del dispositivo.
Esto significa que cualquier solución debe tener en cuenta el tamaño del dispositivo y, si desea cambiar el tamaño de la trama, deberá ejecutar el cálculo nuevamente. Dicho esto, para la mayoría de las aplicaciones (incluida la suya, por el sonido de las cosas), esto no es un problema.
Otra dificultad es asegurarse de que está identificando los grobs correctos dentro del grob del panel, y es difícil ver cómo esto podría generalizarse fácilmente. El uso de las funciones de subconjunto de lista
[[6]]
y[[3]]
en su ejemplo no se puede generalizar a otros gráficos.De todos modos, esta solución funciona midiendo el tamaño y la posición del panel dentro de la tabla, y convirtiendo todos los tamaños a milímetros antes de dividirlos por las dimensiones de la trama en milímetros para convertirlos en espacio npc. He tratado de hacerlo un poco más general extrayendo el panel y los puntos por nombre en lugar de índice numérico.
Ahora podemos probarlo con tu ejemplo:
Y podemos confirmar que estos valores son correctos trazando algunos grobs de punto sobre sus puntos rojos, utilizando nuestros valores como coordenadas npc:
Creado en 2020-03-25 por el paquete reprex (v0.3.0)
fuente
sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
parte es la más extraña. ¿Podría explicar lo que está resumiendo aquí?panel_pos$t
proporciona la fila de la cuadrícula en la que se encuentra el panel (flexible), porseq(panel_pos$t -1)
lo que todos los números de fila están por encima de esto y, porsum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
lo tanto, es la suma de las alturas de estas filas.