ggplot2: Splitting facet/strip text into two lines
Solution 1
I tried this a variety of ways but was frustrated getting the paste(strwrap(text, width=40), collapse=" \n")
to give me results for the single row of data and not concatenate the each bit of text from the entire list.
I came up with a solution that worked best for me. I wrote a function like the one below. Given a dataframe data
with column text
wrapit <- function(text) {
wtext <- paste(strwrap(text,width=40),collapse=" \n ")
return(wtext)
}
data$wrapped_text <- llply(data$text, wrapit)
data$wrapped_text <- unlist(data$wrapped_text)
After I called this function, I just applied my labeller
function to the wrapped_text
column instead of the text
column.
Solution 2
ggplot2 supports a built in way of doing this using label_wrap_gen
.
x <- c(1:3, 1:3)
y <- c(3:1, 1:3)
grp = c(rep("group 1 with a long name",3),rep("group 2 with a long name",3))
d = data.frame(x = x, y =y, grp = grp)
ggplot(d, aes(x=x,y=y)) + geom_line() + facet_wrap(~ grp, labeller = label_wrap_gen(width=10))
Solution 3
You can use a 2-line label:
grp <- c(rep("foo\nbar",3), 1, 1, 1)
qplot(x=x, y=y) + geom_line() + facet_wrap(~ grp)
Marco Sandri
Updated on June 06, 2022Comments
-
Marco Sandri almost 2 years
Consider the following ggplot2 graph with long facet/strip text broken in two lines. The text goes outside the area devoted to facet titles.
library(ggplot2) x <- c(1:3, 1:3) y <- c(3:1, 1:3) grp <- c(0, 0, 0, 1, 1, 1) p <- qplot(x=x, y=y) + geom_line() + facet_wrap(~ grp) grob <- ggplotGrob(p) strip.elem.y <- grid.ls(getGrob(grob, "strip.text.x", grep=TRUE, global=TRUE))$name grob <- geditGrob(grob, strip.elem.y[1], label="First line and\n second line" ) grid.draw(grob)
Is there a way to increase the height of the strip text area ?
-
Earlien over 2 years+1 Very simple, and gives complete control over where you want the breaks to appear. This should be the preferred solution IMO.