R: ggplot2, can I set the plot title to wrap around and shrink the text to fit the plot?

Solution 1:

You have to manually choose the number of characters to wrap at, but the combination of strwrap and paste will do what you want.

wrapper <- function(x, ...) 
{
  paste(strwrap(x, ...), collapse = "\n")
}

my_title <- "This is a really long title of a plot that I want to nicely wrap and fit onto the plot without having to manually add the backslash n, but at the moment it does not"
r + 
  geom_smooth() + 
  ggtitle(wrapper(my_title, width = 20))

Solution 2:

Just for an update as has been mentioned in the comments opts is deprecated. You need to use labs and you could do:

library(ggplot2)

my_title = "This is a really long title of a plot that I want to nicely wrap \n and fit onto the plot without having to manually add the backslash n, but at the moment it does not"

Option 1: Using str_wrap option from the stringr package and setting your ideal width:

 library(stringr)
 ggplot(data = cars, aes(x = speed, y = dist)) +
      geom_smooth() +
      labs(title = str_wrap(my_title, 60))

Option 2: Using the function provided by @Richie https://stackoverflow.com/a/3935429/4767610 like this:

wrapper <- function(x, ...) 
{
  paste(strwrap(x, ...), collapse = "\n")
}
ggplot(data = cars, aes(x = speed, y = dist)) +
      geom_smooth() +
      labs(title = wrapper(my_title, 60))

Option 3: Using the manual option (granted, this is what the OP wanted to avoid but it might be handy)

my_title_manual = "This is a really long title of a plot that I want to nicely wrap \n and fit onto the plot without having to manually add \n the backslash n, but at the moment it does not"

 ggplot(data = cars, aes(x = speed, y = dist)) +
          geom_smooth() +
          labs(title = my_title_manual)

Option 4: Reduce the text size of the title (as in the accepted answer https://stackoverflow.com/a/2633773/4767610)

ggplot(data = cars, aes(x = speed, y = dist)) +
  geom_smooth() +
  labs(title = my_title) +
  theme(plot.title = element_text(size = 10))

Solution 3:

I do not think there is a text wrap option in ggplot2 (I have always just inserted \n manually). You can, however, shrink the size of the title's text by altering your code in the following way:

title.size<-10
r + geom_smooth() + opts(title = my_title,plot.title=theme_text(size=title.size))

In fact, you all aspects of text with the theme_text function.