Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot `facet_grid` label cut off

Tags:

r

ggplot2

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?

like image 763
Alexey Shiklomanov Avatar asked Apr 09 '18 19:04

Alexey Shiklomanov


People also ask

What is the function of Facet_grid () in Ggplot ()?

facet_grid() forms a matrix of panels defined by row and column faceting variables. It is most useful when you have two discrete variables, and all combinations of the variables exist in the data. If you have only one variable with many levels, try facet_wrap() .

How do you remove facet labels?

To remove the label from facet plot, we need to use “strip. text. x” argument inside the theme() layer with argument 'element_blank()'.

What is the difference between Facet_wrap and Facet_grid?

The facet_grid() function will produce a grid of plots for each combination of variables that you specify, even if some plots are empty. The facet_wrap() function will only produce plots for the combinations of variables that have values, which means it won't produce any empty plots.

What is meant by the term faceting in Ggplot?

Faceting is the process that split the chart window in several small parts (a grid), and display a similar chart in each section. Each section usually shows the same graph for a specific group of the dataset. The result is usually called small multiple.


1 Answers

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"
like image 74
Z.Lin Avatar answered Nov 08 '22 19:11

Z.Lin