W ramach usiłowania usunięcia określonego Geom z działki, którą już utworzyłem (SO link here), chciałbym dynamicznie określić typ geom każdej warstwy obiektu ggplot2.Jak określić typ geometrii każdej warstwy obiektu ggplot2?
Zakładając, że nie znam kolejności dodawania warstw, czy istnieje sposób na dynamiczne znajdowanie warstw o określonej geometrii? Jeśli wydrukuję warstwy takie jak poniżej, widzę, że warstwy są przechowywane na liście, ale nie mogę uzyskać dostępu do typu 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)
nie jestem zaznajomiony z obiektami proto i rzeczy próbowałem z proto documentation nie wydają się działać (np p$layers[[1]]$str()
).
Dzięki odpowiedzi poniżej byłem w stanie wymyślić funkcji, która usuwa warstwę dynamicznie:
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
}
Czy dla wygody można podać mały powtarzalny zestaw danych wraz z kodem? – Dason
Ups, copy-paste fail. Dzięki, @Dason –