Alexey Shiklomanov
Alexey Shiklomanov

Reputation: 1642

ggplot `facet_grid` label cut off

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))
  )

ggplot with facet strip text cut-off

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

Answers (1)

Z.Lin
Z.Lin

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)

plot

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

Related Questions