【问题标题】:Wrap ggplot2 text to fit plot width包装 ggplot2 文本以适应绘图宽度
【发布时间】:2019-09-16 05:46:16
【问题描述】:

我想找到一种方法来自动换行 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") 
}

我该怎么做?

或者有没有更好的方法?

【问题讨论】:

  • 很抱歉带来坏消息。由于图形设备是可重新缩放的,因此无法先验地知道绘图的宽度,除非您手动设置纵横比或将 gtable 中的绘图/面板的宽度固定为非“空”单位。唯一的解决方案是 1. 为每个绘图手动自定义标题或 2. 执行一些绘制时间计算,同时考虑绘图的宽度以及标题应在何处分解为新行。即使是drawtime解决方案也不会走得太远,因为标题的高度在那个阶段已经固定了。我希望任何人都能证明相反的情况。
  • 这是一个很好的观点。我认为,如果您说,编写一个自定义绘图保存功能,该问题的答案仍然有用,该功能将在您将绘图保存到文件时自动调整绘图中的文本换行。这可以获取文件的尺寸并使用它在图中相应地包装文本。
  • 感谢@teunbrand 在这里解释问题。
  • 感谢@bschneidr 的建议,这听起来确实可行。目前这有点超出我的编码水平,所以任何建议/答案都将不胜感激。

标签: r ggplot2


【解决方案1】:

您需要提取设备宽度(使用dev.size 函数)。您可以使用wrapper 函数来实现,其中参数dev_width 是当前设备的宽度。但是,您仍然可能需要使用 dev_scaler 参数调整 strwrap 的宽度(对我来说,大约 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))

【讨论】:

  • 非常感谢@ProGibas,我刚刚尝试过。正如你所说,仍然需要手动调整宽度,所以我希望我们能想出一个解决方案,取消手动调整。
  • @captain 我怀疑这是否可能,因为宽度取决于字体大小,并且很难/不可能考虑到这一点
  • @PoGibas 如果您使用 theme_set(theme_classic(base_size = 10)) 之类的函数为 R 会话设置绘图默认值,那么这将是可管理的。
  • 此外,您可以使用theme_get()$text$size 检索 R 会话中使用的默认主题的字体大小,如果它与默认值不同,您可以从特定图中获取字体大小:@987654329 @
  • @bschneidr 谢谢!我明白了,但我想弄清楚如何将它传递给grid::calcStringMetric(或者也许有更好的函数来计算字符串宽度)
猜你喜欢
  • 2019-01-15
  • 1970-01-01
  • 2012-05-07
  • 2015-06-17
  • 2017-09-06
  • 2015-03-31
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多