【发布时间】:2022-11-01 12:36:59
【问题描述】:
我有一个数据集,其中有一列存储数百个写作样本。我的目标是将每个写作样本导出到单独的图像中。下面,我当前的代码:
library(tidyverse)
library(ggplot2)
library(ggtext)
library(magick)
df <- data.frame(
ID = 1:2,
Sample = c("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \r\r\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
)
首先,我计算每个写作样本的字符数(包括单词之间的空格)以确定ggtext::geom_textbox 中的文本大小。这将使用户能够在所有写作样本中设置相同的文本大小:
max_text <- df |>
rowwise() |>
mutate(n = nchar(Sample)) |>
ungroup() |>
top_n(1, n)
p_longest_text <- ggplot(max_text, aes(label = Sample)) +
ggtext::geom_textbox(x = 0, y = 1, width = 0.9, hjust = 0, vjust = 1, size = 3, box.colour = "white") +
theme_void()
ggsave("longest_text.png", p_longest_text, width = 1000, height = 1200, units = "px", bg = "white")
建立足够的文本大小后,我可以使用 for 循环中的值(在当前的玩具数据集中为 size = 3)为每个书写样本生成一个图像。所有图像的文本大小将相同:
for(i in 1:nrow(df)) {
tec <- paste0(df[i,]$ID, ".png")
p <- ggplot(df[i,], aes(label = Sample)) +
ggtext::geom_textbox(x = 0, y = 1, width = 0.9, hjust = 0, vjust = 1, size = 3, box.colour = "white") +
theme_void()
ggsave(tec, p, width = 1000, height = 1200, units = "px", bg = "white")
}
不幸的是,仍然存在两个问题:
- 我无法裁剪出空白区域。不幸的是,
image_trim()不能很好地工作,因为它在文本和裁剪部分之间没有留白。image_crop似乎更有希望,但我不知道如何根据不同的图像对其进行调整。 - 现在,代码要求用户手动尝试不同的文本大小来确定在 for 循环中使用的值。自动化这个过程会很棒,这样代码块就可以在没有用户决定的情况下运行。
任何帮助将不胜感激!
【问题讨论】:
-
为什么文本大小为 3 被视为示例数据中的最佳大小?
-
好问题!实际上,文本大小 3 在这里不太相关,因为这是一个只有两个相对较短的样本的玩具数据集。在我的真实数据集中,我有数百个不同长度的样本。所以我的目标是找到最长的文本(字符最多的文本 - 这是通过上面代码中的
max_text实现的),确定允许最长书写样本适合图像的文本大小,并使用该值来在所有其他图像中重新缩放文本。通过这样做,所有图像将具有相同的文本大小。请让我知道这是否有意义。 -
在您的示例数据中,文本大小为 3 且 ggplot 宽度为 1000 像素会生成环绕的文本。所以你希望你的所有图像都是 1000 像素宽和可变高度?
-
这是正确的!
标签: r ggplot2 crop ggtext magick-r-package