【问题标题】:Automatically adjust size & alignment of Shadow-Text using ggplot2 in R在 R 中使用 ggplot2 自动调整阴影文本的大小和对齐方式
【发布时间】:2021-06-20 05:24:43
【问题描述】:

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

  • 文本大小会自动调整,以防文本太长而无法适应空白图的宽度
  • 文本自动在空白图的中间居中

考虑以下示例:

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代码的输出如下:

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

如果需要,如何自动调整字体大小,如何自动将每个文本居中?

【问题讨论】:

    标签: r ggplot2 text font-size


    【解决方案1】:

    这是您如何做到这一点的一种选择。基本上,您会希望文本的大小根据文本的长度进行缩放。我会将您的文本存储在数据框结构中,一列用于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 或类似的东西进行缩放...根据您的需要调整数学。

    【讨论】:

    • 感谢您的回复!这很好地解决了我的字体大小问题。不幸的是,文本仍然没有居中(例如,文本 1 在右侧太远)。您是否也知道我可以如何解决这个问题?
    • 我刚刚注意到...这是由于使用了geom_text_repel 而不仅仅是geom_text()。你有理由使用ggrepel 版本吗?现在在答案中使用了geom_text(),它似乎已修复。
    • 感谢您回复我! ggrepel 的原因是它创建了一个阴影文本,即蓝色文本后面的红色边框。在您的代码中,此红色边框不再显示。
    • 请看下面我的回答。再次感谢您的帮助!
    • @JoachimSchork,您最初是在您的问题geom_text_repel() 中发布的,尽管图片来自geom_shadowtext()。现在我看到你实际上打算使用geom_shadowtext()。我已经对我的答案进行了调整,所以现在它的文本周围有你想要的红色边框。
    【解决方案2】:

    根据 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)
    }
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多