Vorrei rimuovere un layer
(in questo caso i risultati di geom_ribbon
) da un oggetto griglia creato da ggplot2. C'è un modo per rimuoverlo una volta che fa già parte dell'oggetto?Rimuovere un livello da un grafico ggplot2
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()
# This has the geom_ribbon
p
# This overlays another ribbon on top
p + geom_ribbon(aes(ymin=ymin, ymax=ymax, fill=NA))
Mi piacerebbe questa funzionalità per permettermi di costruire trame più complicate in aggiunta a quelle meno complicate. Sto usando funzioni che restituiscono un oggetto di griglia e quindi stampano il grafico finale una volta che è completamente assemblato. Il grafico di base ha una riga singola con una barra di errore corrispondente (geom_ribbon
) che lo circonda. La trama più complicata avrà più righe e gli oggetti multipli sovrapposti di geom_ribbon
non sono interessanti. Mi piacerebbe rimuoverli dai grafici con più righe. Inoltre, sarò in grado di creare rapidamente versioni alternative utilizzando sfaccettature o altre funzionalità di ggplot2.
Edit: Accettare la risposta di @ mnel come funziona. Ora ho bisogno di determinare come accedere dinamicamente al livello geom_ribbon
, che viene catturato nella domanda SO here.
Edit 2: Per completezza, questa è la funzione che ho creato per risolvere questo problema:
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
}
Puoi descrivere un caso d'uso in cui utilizzeresti questo? – Andrie
Trovare il particolare layer all'interno di 'p $ layers' e poi cancellarlo assegnando' NULL' ad esso probabilmente "funzionerebbe" ma non faccio previsioni sull'affidabilità. – joran
Credo di non aver capito bene. Se devi averlo, ma non vuoi vederlo, perché non 'alpha = 0'? – Mikko