NPC Coordenadas geom_point en ggplot2

LBogaardt:

¿Cómo puedo obtener la X , Y coordenadas de un geom_point en un ggplot , donde el marco de referencia es toda traza la imagen?

Puedo crear una ggplot con algunos geom_point s utilizando:

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:

introducir descripción de la imagen aquí

Al convertir esto en un Grob , puedo extraer alguna información adicional sobre esta ggplot , al igual que las coordenadas con respecto al panel de la trama, marcados por la flecha de color 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 la X , Y coordenadas cuando empiece a medir desde la esquina inferior izquierda de la imagen completa, marcada por la flecha verde?

Si es posible, me gustaría que la solución para tener en cuenta el tema de la ggplot . Adición de 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 que el tamaño de fuente de los ejes cambia dependiendo de la anchura y la altura de la trama, que afectan el tamaño relativo de la parcela panel . Por lo que no será trivial para proporcionar la ubicación de la APN unidades sin definir el ancho de parcela y altura trama . Si es posible, dar la ubicación de los geom_points como una función de la anchura de trama y altura parcela .

Allan Cameron:

Al cambiar el tamaño de un ggplot, la posición de los elementos dentro del panel no están en posiciones fijas en el espacio de la APN. Esto se debe a algunos de los componentes de la trama han fijado tamaños, y algunos de ellos (por ejemplo, el panel) dimensiones de cambio de acuerdo con el tamaño del dispositivo.

Esto significa que cualquier solución debe tener el tamaño del dispositivo en cuenta, y si desea cambiar el tamaño de la trama, que tendrían que ejecutar de nuevo el cálculo. Una vez dicho esto, para la mayoría de las aplicaciones (incluyendo el suyo, por los sonidos de las cosas), esto no es un problema.

Otra dificultad es asegurarse de que está identificando los grobs correctas dentro del panel de Grob, y es difícil ver cómo esto podría fácilmente ser generalizado. Usando las funciones de la lista de subconjuntos [[6]]y [[3]]en su ejemplo no es generalizable a otras parcelas.

De todos modos, esta solución funciona midiendo el tamaño del panel y la posición dentro de la GTABLE, y la conversión de todos los tamaños de milímetros antes de dividir por las dimensiones de la trama en milímetros para convertir al espacio de la APN. He tratado de que sea un poco más general mediante la extracción del panel y los puntos por su nombre en lugar de índice numérico.

library(ggplot2)
library(grid)
require(gtable)

get_x_y_values <- function(gg_plot)
{
  img_dim      <- grDevices::dev.size("cm") * 10
  gt           <- ggplot2::ggplotGrob(gg_plot)
  to_mm        <- function(x) grid::convertUnit(x, "mm", valueOnly = TRUE)
  n_panel      <- which(gt$layout$name == "panel")
  panel_pos    <- gt$layout[n_panel, ]
  panel_kids   <- gtable::gtable_filter(gt, "panel")$grobs[[1]]$children
  point_grobs  <- panel_kids[[grep("point", names(panel_kids))]]
  from_top     <- sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
  from_left    <- sum(to_mm(gt$widths[seq(panel_pos$l - 1)]))
  from_right   <- sum(to_mm(gt$widths[-seq(panel_pos$l)]))
  from_bottom  <- sum(to_mm(gt$heights[-seq(panel_pos$t)]))
  panel_height <- img_dim[2] - from_top - from_bottom
  panel_width  <- img_dim[1] - from_left - from_right
  xvals        <- as.numeric(point_grobs$x)
  yvals        <- as.numeric(point_grobs$y)
  yvals        <- yvals * panel_height + from_bottom
  xvals        <- xvals * panel_width + from_left
  data.frame(x = xvals/img_dim[1], y = yvals/img_dim[2])
}

Ahora podemos probar con su ejemplo:

my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
             geom_point(aes(x, y), color = "red")

my.points <- get_x_y_values(my.plot)
my.points
#>           x         y
#> 1 0.1252647 0.1333251
#> 2 0.5004282 0.2330669
#> 3 0.9479917 0.9442339

Y podemos confirmar estos valores son correctos mediante el trazado de algunas grobs puntos sobre sus puntos rojos, usando nuestros valores como NPC coordenadas:

my.plot
grid::grid.draw(pointsGrob(x = my.points$x, y = my.points$y, default.units = "npc"))

Creado el 03/25/2020 por el paquete de reprex (v0.3.0)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=370051&siteId=1
Recomendado
Clasificación