I am trying to understand how I can make changes to the internals of a ggplot2 chart. I started reading the few ressources I could find about ggplot_built and <
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
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)