Reputation: 1642
In ggplot
, when using facet_grid(..., space = "free_y")
and the number of points within a group is small, the facet title gets cut off.
For example...
library(tidyverse)
d <- tibble(
x = factor(1:40),
y = rnorm(40),
g = c(rep("GROUP 1", 39), "GROUP 2")
)
ggplot(d) +
aes(x = x, y = y) +
geom_col() +
facet_grid(g ~ ., scales = "free_y", space = "free_y") +
coord_flip() +
theme(
strip.text.y = element_text(angle = 0, size = rel(4))
)
Is there any way to get the GROUP 2
text to not be cut-off at the facet grid margins? I'm aware that I can just stretch the plot, but that's not really a satisfying solution -- after all, there's all that margin space between facets! Is there a way to get the label to just bleed into those?
Upvotes: 10
Views: 4773
Reputation: 29075
You can turn off the clipping if you convert the plot to a grob:
pg <- ggplotGrob(pp)
for(i in which(grepl("strip-r", pg$layout$name))){
pg$grobs[[i]]$layout$clip <- "off"
}
grid::grid.draw(pg)
The above turns off clipping for all facet strip labels on the right, which is flexible for plotting using different datasets.
Alternatively, if you know exactly which ones you want to turn off, you can also examine the grob & manually specify the value(s) for i
:
> pg
TableGrob (12 x 8) "layout": 18 grobs
z cells name grob
1 0 ( 1-12, 1- 8) background rect[plot.background..rect.908]
2 1 ( 6- 6, 4- 4) panel-1-1 gTree[panel-1.gTree.839]
3 1 ( 8- 8, 4- 4) panel-1-2 gTree[panel-2.gTree.852]
4 3 ( 5- 5, 4- 4) axis-t-1 zeroGrob[NULL]
5 3 ( 9- 9, 4- 4) axis-b-1 absoluteGrob[GRID.absoluteGrob.865]
6 3 ( 6- 6, 3- 3) axis-l-1 absoluteGrob[GRID.absoluteGrob.872]
7 3 ( 8- 8, 3- 3) axis-l-2 absoluteGrob[GRID.absoluteGrob.879]
8 3 ( 6- 6, 6- 6) axis-r-1 zeroGrob[NULL]
9 3 ( 8- 8, 6- 6) axis-r-2 zeroGrob[NULL]
10 2 ( 6- 6, 5- 5) strip-r-1 gtable[strip]
11 2 ( 8- 8, 5- 5) strip-r-2 gtable[strip]
12 4 ( 4- 4, 4- 4) xlab-t zeroGrob[NULL]
13 5 (10-10, 4- 4) xlab-b titleGrob[axis.title.x..titleGrob.858]
14 6 ( 6- 8, 2- 2) ylab-l titleGrob[axis.title.y..titleGrob.855]
15 7 ( 6- 8, 7- 7) ylab-r zeroGrob[NULL]
16 8 ( 3- 3, 4- 4) subtitle zeroGrob[plot.subtitle..zeroGrob.905]
17 9 ( 2- 2, 4- 4) title zeroGrob[plot.title..zeroGrob.904]
18 10 (11-11, 4- 4) caption zeroGrob[plot.caption..zeroGrob.906]
# note that in this case, we actually only need to turn off clipping for
# strip-r-2, the 11th grob.
pg$grobs[[11]]$layout$clip <- "off"
Upvotes: 8