使用 R 中的 ggplot2 自动调整阴影文本的大小和对齐方式

Automatically adjust size & alignment of Shadow-Text using ggplot2 in R

我可以在一个空的 ggplot2 图中创建阴影文本 。我想创建大量这样的地块,其中:

考虑以下示例:

library("ggrepel")                       # Load packages
library("ggplot2")

my_text <- c("Text 1",                   # Three different text elements
             "Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
             "Some Other Text 3")

for(i in 1:length(my_text)) {

  ggp <- ggplot() +                      # Draw ggplot2 plot with text only
    theme_void() +
    geom_text_repel(mapping = aes(1, 1, label = my_text[i]),
                    color = "blue",
                    bg.color = "red",
                    bg.r = 0.05)

  ggsave(ggp,                            # Save ggplot2 plot
         filename = paste0("my_text_", i, ".png"),
         bg = "transparent",
         width = 101.6,
         height = 57.15,
         scale = 0.05,
         dpi = 1000)
}

之前 R 代码的输出如下所示:

如您所见,我们创建了三个带有阴影文本的不同图像。但是,这些文本元素中的 none 恰好在图的中间对齐。此外,第二个文本太长,不适合绘图区域,因此应使用较小的字体。

如何在必要时自动调整字体大小,以及如何自动将每个文本居中?

这里有一种方法可以做到这一点。基本上,您会希望文本的大小根据文本的长度进行缩放。我会将您的文本存储在数据框架结构中,一列用于 text,另一列用于 length:

library(ggplot2)
library(shadowtext)

my_text_df <- data.frame(
  text=c("Text 1", "Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
         "Some Other Text 3")
) 

my_text_df$length <- nchar(my_text_df$text)  # compute length of each string
base_text_size <- 13   # base size used for the plot
weighting <- 9    # some weighting value in calculation

for(i in 1:length(my_text_df)) {
  ggp <- ggplot() +                      # Draw ggplot2 plot with text only
    theme_void() +
    geom_shadowtext(
      mapping = aes(1, 1, label = my_text_df$text[i]),
      color = "blue", bg.color = "red", bg.r = 0.05,
      size= base_text_size * weighting/my_text_df$length[i]
    )

  ggsave(ggp,                            # Save ggplot2 plot
         filename = paste0("my_text_", i, ".png"),
         bg = "transparent",
         width = 101.6,
         height = 57.15,
         scale = 0.05,
         dpi = 1000)
}

这为您提供了以下这些图。您可以调整与 size= 关联的算法以满足您的需要 - 或者使用类似的方法基于每个文本字符串的不同计算。在这种情况下,我是线性缩放的,但您可能想要使用 1/log 或类似的东西进行缩放...根据您的需要来尝试数学运算。

根据 chemdork123 的响应和对其他软件包的额外 Google 搜索,我找到了解决方案。正如您在下面看到的,我正在使用 chemdork123 的建议来加权我的文本大小,并且我正在使用 shadowtext 包而不是 ggrepel 包。此外,我正在绘制不可见的数据点以便能够调整我的文本位置:

library("ggplot2")
library("shadowtext")

data <- data.frame(x = 0:1,
                   y = 0:1)

my_text <- c("Text 1",                   # Three different text elements
             "Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
             "Some Other Text 3")

my_text_size <- ifelse(nchar(my_text) <= 70,
                       200 / 40,
                       200 / nchar(my_text))

for(i in 1:length(my_text)) {

  ggp <- ggplot(data, aes(x, y)) +       # Draw ggplot2 plot with text only
    geom_point(alpha = 0) +
    theme_void() +
    geom_shadowtext(mapping = aes(x = 0.5, y = 1, label = my_text[i]),
                    color = "blue",
                    bg.color = "red",
                    bg.r = 0.05,
                    size = my_text_size[i])

  ggsave(ggp,                            # Save ggplot2 plot
         filename = paste0("my_text_", i, ".png"),
         bg = "transparent",
         width = 101.6,
         height = 57.15,
         scale = 0.05,
         dpi = 1000)
}

输出: