Я хотел бы удалить layer
(в этом случае результаты geom_ribbon
) из созданного 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))
Я бы хотел, чтобы эта функциональность позволяла мне создавать более сложные сюжеты поверх менее сложных. Я использую функции, которые возвращают объект сетки, а затем распечатывают окончательный график после его полной сборки. На базовом участке имеется одна строка с соответствующей geom_ribbon
(geom_ribbon
). Более сложный сюжет будет иметь несколько линий, а многократные перекрывающиеся объекты geom_ribbon
отвлекают. Я хотел бы удалить их с участков с несколькими строками. Кроме того, я смогу быстро создавать альтернативные версии с использованием фасетов или других функций ggplot2.
Изменение: Принять ответ @mnel, поскольку он работает. Теперь мне нужно определить, как динамически обращаться к слою geom_ribbon
, который geom_ribbon
в вопросе SO здесь.
Изменить 2: Для полноты, это функция, которую я создал для решения этой проблемы:
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
}
Изменить 3: см. Принятый ответ ниже для последних версий ggplot (> = 2.xy)