37 lines
1.1 KiB
R
37 lines
1.1 KiB
R
|
|
library(ggplot2)
|
|
library(gtable)
|
|
library(lemon)
|
|
# https://stackoverflow.com/questions/54438495/shift-legend-into-empty-facets-of-a-faceted-plot-in-ggplot2
|
|
|
|
shift_legend2 <- function(p) {
|
|
# check if p is a valid object
|
|
if(!(inherits(p, "gtable"))){
|
|
if(inherits(p, "ggplot")){
|
|
gp <- ggplotGrob(p) # convert to grob
|
|
} else {
|
|
message("This is neither a ggplot object nor a grob generated from ggplotGrob. Returning original plot.")
|
|
return(p)
|
|
}
|
|
} else {
|
|
gp <- p
|
|
}
|
|
|
|
# check for unfilled facet panels
|
|
facet.panels <- grep("^panel", gp[["layout"]][["name"]])
|
|
empty.facet.panels <- sapply(facet.panels, function(i) "zeroGrob" %in% class(gp[["grobs"]][[i]]),
|
|
USE.NAMES = F)
|
|
empty.facet.panels <- facet.panels[empty.facet.panels]
|
|
|
|
if(length(empty.facet.panels) == 0){
|
|
message("There are no unfilled facet panels to shift legend into. Returning original plot.")
|
|
return(p)
|
|
}
|
|
|
|
# establish name of empty panels
|
|
empty.facet.panels <- gp[["layout"]][empty.facet.panels, ]
|
|
names <- empty.facet.panels$name
|
|
|
|
# return repositioned legend
|
|
reposition_legend(p, 'center', panel=names)
|
|
}
|