dado un ggplot de, por ejemplo, puntos, ¿cómo averiguar la fila de datos que un punto dado correspondió a?¿Cómo relaciona ggplot2 grobs con los datos?
Una parcela de muestreo:
library(ggplot2)
(p <- ggplot(mtcars, aes(mpg, wt)) +
geom_point() +
facet_wrap(~ gear)
)
podemos obtener el grobs que contienen puntos con grid.ls
+ grid.get
.
grob_names <- grid.ls(print = FALSE)$name
point_grob_names <- grob_names[grepl("point", grob_names)]
point_grobs <- lapply(point_grob_names, grid.get)
Esta última variable contiene detalles de las coordenadas x-y, y tamaño de punto, etc. (prueba unclass(point_grobs[[1]])
), pero no es obvio cómo consigo la fila de datos en mtcars
que cada punto corresponde a.
Para responder a la pregunta de por qué kohske estoy haciendo esto, estoy usando gridSVG
para crear un diagrama de dispersión interactiva. Cuando pasa el mouse sobre un punto, quiero mostrar información contextual. En el ejemplo de mtcars, podría mostrar una información sobre herramientas con el nombre del automóvil u otros valores de esa fila del marco de datos.
Mi idea hacky hasta ahora es incluir una columna id
como una etiqueta de texto invisible:
mtcars$id <- seq_len(nrow(mtcars))
p + geom_text(aes(label = id), colour = NA)
A continuación, recorrer el árbol de grobs desde el punto Grob a la Grob texto, y mostrar la fila del conjunto de datos indexado por la etiqueta.
Ésta es incómoda y poco generalizable. Si hay una manera de almacenar el valor id
dentro del punto grob, sería mucho más limpio.
No hay salida fácil. ¿Cuál es tu objetivo final? Puede haber alternativas. – kohske
@kohske: Demasiado tiempo para un comentario, por lo que he actualizado la pregunta para explicar lo que estoy haciendo. –
Muy interesante. Entiendo tu propósito Lamentablemente, no tenemos forma de acceder a los datos a través de grob (incluso en la próxima versión, probablemente). Pero tal vez sea útil tener información sobre los datos (especialmente cuando 'stat =" identity "). Lo discutiré. – kohske