【发布时间】: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 的建议,这听起来确实可行。目前这有点超出我的编码水平,所以任何建议/答案都将不胜感激。