包装ggplot2文字以适合绘图宽度

时间:2019-04-26 17:13:10

标签: r ggplot2

我想找到一种自动包装ggplot标题(或字幕或标题)以占据整个绘图宽度然后包装的方法。

previous question处理如何使用包装函数很好地包装代码,但是您仍然必须手动指定width=。如何重新编写此包装器功能,以根据绘图的绘图宽度自动包装文本?

到目前为止,我的代码:

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

library("ggplot2")

my_title <- "This is a really long title of a plot that I want to nicely wrap and fit the plot width without having to manually add the backslash n, or having to specify with= manually"

ggplot(data = cars, aes(x = speed, y = dist)) +    
  geom_smooth() +   
  labs(title = wrapper(my_title, width = 100))

我的想法:以某种方式从ggplot中提取绘图宽度,然后将其包含在包装函数中,也许像这样:

plot_width <- ???

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

我该怎么做?

还是有更好的方法?

1 个答案:

答案 0 :(得分:2)

您需要提取设备宽度(使用dev.size函数)。您可以使用wrapper函数来实现,其中参数dev_width是当前设备的宽度。但是,您仍然可能需要使用strwrap参数来调整dev_scaler的宽度(大多数情况下〜12左右的值对我有用)。

#' @param label character string to wrap
#' @param dev_width numeric value specifying width of current device
#' @param dev_scaler numeric value to scale dev_width (might be around ~12)
#' 
wrapper <- function(label, dev_width = dev.size("in")[1], dev_scaler = 12)  {   
  paste(strwrap(label, dev_width * dev_scaler), collapse = "\n") 
}

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