Come parte di uno sforzo per rimuovere una geom specifica da un grafico che ho già creato (SO link here), mi piacerebbe determinare dinamicamente il tipo di geom di ogni livello di un oggetto ggplot2.Come determinare il tipo di geom di ogni livello di un oggetto ggplot2?
Supponendo che non conosca l'ordine in cui ho aggiunto i livelli, esiste un modo per trovare dinamicamente i livelli con una geom specifica? Se stampo i livelli come faccio di seguito, posso vedere che i livelli sono memorizzati in un elenco, ma non riesco ad accedere al tipo di geom.
library(ggplot2)
dat <- data.frame(x=1:3, y=1:3, ymin=0:2, ymax=2:4)
p <- ggplot(dat, aes(x=x, y=y)) + geom_ribbon(aes(ymin=ymin, ymax=ymax), alpha=0.3) + geom_line()
p$layers
[[1]]
mapping: ymin = ymin, ymax = ymax
geom_ribbon: na.rm = FALSE, alpha = 0.3
stat_identity:
position_identity: (width = NULL, height = NULL)
[[2]]
geom_line:
stat_identity:
position_identity: (width = NULL, height = NULL)
Non ho dimestichezza con gli oggetti Proto e le cose che ho provato dal proto documentation non sembra funzionare (ad esempio p$layers[[1]]$str()
).
Grazie alle risposte qui sotto sono stato in grado di venire con una funzione che elimina uno strato dinamico:
remove_geom <- function(ggplot2_object, geom_type) {
layers <- lapply(ggplot2_object$layers, function(x) if(x$geom$objname == geom_type) NULL else x)
layers <- layers[!sapply(layers, is.null)]
ggplot2_object$layers <- layers
ggplot2_object
}
Proprio come un ulteriore vantaggio è possibile fornire un piccolo insieme di dati riproducibili con il vostro codice? – Dason
Whoops, copia-incolla fallisce. Grazie, @Dason –