Remove geom(s) from an existing ggplot chart?

You can access / manipulate g's elements the way you would do with other R object.

g$layers
#[[1]]
#geom_point: na.rm = FALSE
#stat_identity: na.rm = FALSE
#position_identity 

#[[2]]
#mapping: label = Sepal.Width 
#geom_text: parse = FALSE, check_overlap = FALSE, na.rm = FALSE
#stat_identity: na.rm = FALSE
#position_identity 

Remove geom_text:

g$layers[[2]] <- NULL

Remove all layers

g$layers <- NULL
g

enter image description here


The gginnards package offers some functions to manipulate ggplot layers, see the vignette User Guide: 4 Manipulation of plot layers for details.


edit

Following the question of How can I extract plot axes' ranges for a ggplot2 object? I came to a solution that uses ggplot_build and ggplot_gtable. The idea is simply to copy the layout parameters taken from ggplot_built(p) to the new plot, for which we deleted a layer.

# create a copy of p
p_new <- p

# delete the first layer
p_new$layers[[1]] <- NULL
p_new_build <- ggplot_build(p_new)

# this is the important line
p_new_build$layout$panel_params <- ggplot_build(p)$layout$panel_params

library(gridExtra)
grid.arrange(p, ggplot_gtable(p_new_build), ncol = 2)

enter image description here


You can use gginnards package to make life easier

library(ggplot2)

### sample plot w/ both points and labels
g <- ggplot(iris, aes(Petal.Length, Petal.Width)) + 
  geom_point() + 
  geom_text(aes(label = Sepal.Width))
g

### https://cran.rstudio.com/web/packages/gginnards/vignettes/user-guide-2.html
library(gginnards)

### remove points
delete_layers(g, "GeomPoint")

### remove text
delete_layers(g, "GeomText")


You can try to include some alpha. Instead of removing the layer, it will not show up.

count(mpg, class) %>%
  mutate(pct=n/sum(n)) %>%
  ggplot(aes(class, pct)) +
  geom_col(fill="blue", alpha=0) +
  geom_line(group=1) +
  geom_point(size=4)

enter image description here

You can of course add the alpha afterwards like

p <- ggplot_build(p)
p$data[[1]]$alpha <- 0
plot(ggplot_gtable(p))

Tags:

R

Ggplot2