【问题标题】:Multiple ggtext Markdown Annotations in ggplot2 Take Long Time to Render/Don't Renderggplot2中的多个ggtext Markdown注释需要很长时间才能渲染/不渲染
【发布时间】:2021-12-07 23:58:17
【问题描述】:

一段时间以来,我一直在使用 Claus Wilke 的出色 ggtext 包进行降价注释,直到现在它运行良好。在使用 ggtext 制作多个文本注释(在多行上混合粗体和常规文本)的过程中,无论是使用 ggtext::geom_richtext() 还是 ggtext::geom_textbox(),我发现我使用的 geom_richtext() 越多添加了将渲染时间增加到它会不断搅动的程度(我上次在 45 分钟后放弃了)。

当然,使用所有 geom_richtext() 和 element_markdown() 创建和保存 ggplot 对象花费的时间很少。但是当我尝试查看情节或使用 ggsave 保存为 png/jpeg 时,它再次永远搅动(再次,我在 30 分钟后放弃了)。

我在下面包含了一个示例reprex。

我对 ggtext 和 ggplot2 高级用户的问题:

  1. 在 ggplot2 图中可以使用的 ggtext 对象的数量是否有上限?我不精通网格和 ggplot 的基本机制。
  2. 在 ggplot2 的注释中是否有 ggtext 的替代品来混合字体粗细?从@aosmith 在 SO:html - Embolden substring of object passed through geom_text() - Stack Overflow 看到这个后,我已经尝试了 plotmath 路线。问题? atop() 仅适用于一行,而不适用于多行文本。

FWIW,我的代码的完整非 reprex 版本(以及我试图在 ggplot2 中重新创建的即)位于 https://github.com/kpivert/wsj/tree/main/01_R/06_cpi_again

如果您有任何建议,我们将不胜感激。

如果您需要进一步说明或者如果 reprex 不起作用,请告诉我。

感谢您的时间和考虑。

库尔蒂斯

require(ggthemes)
#> Loading required package: ggthemes
require(ggtext)
#> Loading required package: ggtext
require(tictoc)
#> Loading required package: tictoc
require(tidyverse)
#> Loading required package: tidyverse

df <- data.frame(
  DATE = seq(as.Date("1913-01-01"), as.Date("2020-12-01"), "month")
  ) %>% 
  mutate(
    var = rnorm(n = nrow(.), mean = 0, sd = 0.5)
  )

# Years for X Axis Labels

yr_labs <- seq(as.Date("1915-01-01"), as.Date("2020-01-01"), by = "5 years") %>% 
  str_sub(start = 1, end = 4) 

yr_labs <- case_when(
  yr_labs == "1915" ~ "1915",
  yr_labs == "2020" ~ "2020",
  TRUE ~ str_c("'", str_sub(yr_labs, 3, 4))
)

tic()
ggplot(
  df, 
  aes(
    x = DATE,
    y = var
    )
  ) +
  geom_line(
    lwd = 0.2,
    color = "blue"
  ) +
  scale_x_continuous(
    breaks = seq(as.Date("1915-01-01"), as.Date("2020-01-01"), by = "5 years"), 
    labels = yr_labs
  ) +
  theme_tufte() +
  theme(
    panel.grid.major.y = element_line(size = .1),
    axis.ticks.y = element_blank(),
    axis.text.y = element_text(
      vjust = - 0.8, 
      margin = margin(l = 20, r = -20)
    ),
    plot.title = element_text(size = 16),
    plot.subtitle = element_text(size = 10),
    plot.caption = element_text(hjust = 0)
  ) +
  labs(
    x = "", 
    y = "",
    caption = "Source: Randomness",
    title = "Reprex Title",
    subtitle = "Reprex Subtitle"
  ) +
  # Annotations ----
# 1. WW I ----
geom_segment(
  aes(
    x = as.Date("1914-09-01"), 
    y = 1.25,
    xend = as.Date("1918-11-01"),
    yend = 1.25
  ),
  lwd = 1
) +
  geom_segment(
    aes(
      x = as.Date("1916-08-01"), 
      y = 1.25,
      xend = as.Date("1916-08-01"),
      yend = 1.28
    ),
    linetype = "dotted"
  ) +
geom_richtext(
  x = as.Date("1916-01-01"),
  y = 1.28,
  label = "<b>1914-18</b><br>World<br>War I",
  fill = NA,
  label.color = NA
) 
toc()
#> 20.668 sec elapsed

reprex package (v2.0.1) 于 2021-12-07 创建

会话信息
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.1.0 (2021-05-18)
#>  os       macOS Big Sur 10.16         
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       America/New_York            
#>  date     2021-12-07                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date       lib source        
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.1.0)
#>  backports     1.2.1   2020-12-09 [1] CRAN (R 4.1.0)
#>  broom         0.7.9   2021-07-27 [1] CRAN (R 4.1.0)
#>  cellranger    1.1.0   2016-07-27 [1] CRAN (R 4.1.0)
#>  cli           3.0.1   2021-07-17 [1] CRAN (R 4.1.0)
#>  colorspace    2.0-2   2021-06-24 [1] CRAN (R 4.1.0)
#>  crayon        1.4.1   2021-02-08 [1] CRAN (R 4.1.0)
#>  curl          4.3.2   2021-06-23 [1] CRAN (R 4.1.0)
#>  DBI           1.1.1   2021-01-15 [1] CRAN (R 4.1.0)
#>  dbplyr        2.1.1   2021-04-06 [1] CRAN (R 4.1.0)
#>  digest        0.6.28  2021-09-23 [1] CRAN (R 4.1.0)
#>  dplyr       * 1.0.7   2021-06-18 [1] CRAN (R 4.1.0)
#>  ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.0)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.1.0)
#>  fansi         0.5.0   2021-05-25 [1] CRAN (R 4.1.0)
#>  farver        2.1.0   2021-02-28 [1] CRAN (R 4.1.0)
#>  fastmap       1.1.0   2021-01-25 [1] CRAN (R 4.1.0)
#>  forcats     * 0.5.1   2021-01-27 [1] CRAN (R 4.1.0)
#>  fs            1.5.0   2020-07-31 [1] CRAN (R 4.1.0)
#>  generics      0.1.0   2020-10-31 [1] CRAN (R 4.1.0)
#>  ggplot2     * 3.3.5   2021-06-25 [1] CRAN (R 4.1.0)
#>  ggtext      * 0.1.1   2020-12-17 [1] CRAN (R 4.1.0)
#>  ggthemes    * 4.2.4   2021-01-20 [1] CRAN (R 4.1.0)
#>  glue          1.4.2   2020-08-27 [1] CRAN (R 4.1.0)
#>  gridtext      0.1.4   2020-12-10 [1] CRAN (R 4.1.0)
#>  gtable        0.3.0   2019-03-25 [1] CRAN (R 4.1.0)
#>  haven         2.4.3   2021-08-04 [1] CRAN (R 4.1.0)
#>  highr         0.9     2021-04-16 [1] CRAN (R 4.1.0)
#>  hms           1.1.0   2021-05-17 [1] CRAN (R 4.1.0)
#>  htmltools     0.5.2   2021-08-25 [1] CRAN (R 4.1.0)
#>  httr          1.4.2   2020-07-20 [1] CRAN (R 4.1.0)
#>  jsonlite      1.7.2   2020-12-09 [1] CRAN (R 4.1.0)
#>  knitr         1.36    2021-09-29 [1] CRAN (R 4.1.0)
#>  labeling      0.4.2   2020-10-20 [1] CRAN (R 4.1.0)
#>  lifecycle     1.0.1   2021-09-24 [1] CRAN (R 4.1.0)
#>  lubridate     1.7.10  2021-02-26 [1] CRAN (R 4.1.0)
#>  magrittr      2.0.1   2020-11-17 [1] CRAN (R 4.1.0)
#>  markdown      1.1     2019-08-07 [1] CRAN (R 4.1.0)
#>  mime          0.12    2021-09-28 [1] CRAN (R 4.1.0)
#>  modelr        0.1.8   2020-05-19 [1] CRAN (R 4.1.0)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.1.0)
#>  pillar        1.6.3   2021-09-26 [1] CRAN (R 4.1.0)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.1.0)
#>  purrr       * 0.3.4   2020-04-17 [1] CRAN (R 4.1.0)
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.1.0)
#>  Rcpp          1.0.7   2021-07-07 [1] CRAN (R 4.1.0)
#>  readr       * 2.0.1   2021-08-10 [1] CRAN (R 4.1.0)
#>  readxl        1.3.1   2019-03-13 [1] CRAN (R 4.1.0)
#>  reprex        2.0.1   2021-08-05 [1] CRAN (R 4.1.0)
#>  rlang         0.4.11  2021-04-30 [1] CRAN (R 4.1.0)
#>  rmarkdown     2.11    2021-09-14 [1] CRAN (R 4.1.0)
#>  rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.0)
#>  rvest         1.0.1   2021-07-26 [1] CRAN (R 4.1.0)
#>  scales        1.1.1   2020-05-11 [1] CRAN (R 4.1.0)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.1.0)
#>  stringi       1.7.5   2021-10-04 [1] CRAN (R 4.1.0)
#>  stringr     * 1.4.0   2019-02-10 [1] CRAN (R 4.1.0)
#>  styler        1.5.1   2021-07-13 [1] CRAN (R 4.1.0)
#>  tibble      * 3.1.5   2021-09-30 [1] CRAN (R 4.1.0)
#>  tictoc      * 1.0.1   2021-04-19 [1] CRAN (R 4.1.0)
#>  tidyr       * 1.1.3   2021-03-03 [1] CRAN (R 4.1.0)
#>  tidyselect    1.1.1   2021-04-30 [1] CRAN (R 4.1.0)
#>  tidyverse   * 1.3.1   2021-04-15 [1] CRAN (R 4.1.0)
#>  tzdb          0.1.2   2021-07-20 [1] CRAN (R 4.1.0)
#>  utf8          1.2.2   2021-07-24 [1] CRAN (R 4.1.0)
#>  vctrs         0.3.8   2021-04-29 [1] CRAN (R 4.1.0)
#>  withr         2.4.2   2021-04-18 [1] CRAN (R 4.1.0)
#>  xfun          0.26    2021-09-14 [1] CRAN (R 4.1.0)
#>  xml2          1.3.2   2020-04-23 [1] CRAN (R 4.1.0)
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.1.0)
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.1/Resources/library

【问题讨论】:

  • 代替geom_segmentgeom_richtext 层,试试annotate("segment", x = as.Date("1914-09-01"), y = 1.25, xend = as.Date("1918-11-01"), yend = 1.25, lwd = 1 ) + annotate("richtext", x = as.Date("1916-01-01"), y = 1.28, label = "&lt;b&gt;1914-18&lt;/b&gt;&lt;br&gt;World&lt;br&gt;War I", fill = NA, label.color = NA ),在我的机器上要快得多。我相信您的方法将分段和文本分别绘制了 1,296 次,每行原始数据一次。 annotate 函数允许您添加不基于原始数据的一次性几何图形。
  • 作为参考,如果您寻找“ggplot2 overplotting”,那么还有其他关于 SO 的问题可以解决其他方向的类似问题,例如:stackoverflow.com/questions/11618392/…stackoverflow.com/a/10953050/6851825
  • 非常感谢@JonSpring。呃,这当然是过度绘制了。我完全错过了 reprex 中的线索(模糊文本,这里没有显示,因为我没有足够的声誉来发布 png)。但是,我不知道注释中的“richtext”geom,它当然像一个魅力,包括extrafont。再次感谢您的快速回复和帮助。

标签: r ggplot2 ggtext


【解决方案1】:

作为记录,Jon Spring 正确地指出了这个问题,即geom_segment()geom_richtext() 调用中的美学映射问题。除了他使用annotate() 的解决方案之外,您还可以传递一个数据框并使用inherit.aes = FALSE,这样文本或段的重叠次数就不会与数据集中的行数相同。例如:

 geom_richtext(
    inherit.aes = FALSE,
    data = tibble(
    x = as.Date("1916-01-01"),
    y = 1.28,
    label = "<b>1914-18</b><br>World<br>War I"),
    aes(
      x = x,
      y = y,
      label = label),
    fill = NA,
    label.color = NA
  )

Kara Woo 在 2021 rstudio::global 会议上的精彩演讲解决了这个问题:https://www.rstudio.com/resources/rstudioglobal-2021/always-look-on-the-bright-side-of-plots/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 2010-11-17
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多