【问题标题】:How can I speed up adding many ggplot layers/geoms in a for loop?如何加快在 for 循环中添加许多 ggplot 图层/几何图形?
【发布时间】:2020-01-24 05:27:54
【问题描述】:
library(ggplot2)
library(magrittr)
library(data.table)

Nbars = 2

generate_eg_data <- function() {
  eg_data = data.table(LL = 0:99, UL = 1:100, val = sort(runif(100, 0, 1)))
  eg_data[, valColor := val %>% multiply_by(255) %>% ceiling %>% as.hexmode %>% list %>% c(., ., .) %>% do.call(paste0, .) %>% paste0("#", .)]
  return(eg_data)
}

lst_eg_data <- lapply(seq(Nbars), function(i) {
  return(generate_eg_data())
})

p <- ggplot() +
  scale_x_continuous(limits = c(0, 100)) +
  scale_y_continuous(limits = c(0, Nbars + 1)) +
  theme_classic()
for (i in seq(Nbars)) {
  for (j in seq(nrow(lst_eg_data[[i]]))) {
    p %<>% add(geom_ribbon(data = lst_eg_data[[i]][j, .(x = c(LL, UL), ymin = rep(i - 0.25, 2), ymax = rep(i + 0.25, 2))],
                           aes(x = x, ymin = ymin, ymax = ymax),
                           fill = lst_eg_data[[i]][j, valColor]))
  }
}
p

以上内容足以证明我想要的结果。为简单起见,在上面我为每个条生成了类似的valColor,但实际上每个条在不同的 RGB 组合(即不仅是灰度)下变化很大。

代码可以工作,但是太慢了,因为实际上我在每个图中有 6 个条形图和 36 个这样的图块以及一些其他辅助层,我想借助gridExtra::arrangeGrob。该过程已经运行了一个多小时,还没有完成。

我想知道是不是因为我试图使用 100 个单独的层来添加每个条。如果是这样,是否可以将每个条添加为单个层,同时保留为每个条定义的唯一着色方案?或者还有其他原因导致缓慢的情节,我怎样才能让它更有效率?谢谢!

【问题讨论】:

    标签: r loops ggplot2 plot gridextra


    【解决方案1】:

    循环使整个事情变慢,没有必要,不好的风格,应该避免。 相反,外环 (i) 应与 y 美学相匹配,而内环 (j) 应与 x 美学相匹配。 (除此之外,人们通常会使用类似p &lt;- p + geom_ribbon() 而不是%&lt;&gt;%。)

    这是一种使用geom_tile() 的方法,但其他几何图形也可能是合适的。 请注意,我首先将您的两个数据框 (lst_eg_data) 列表转换为单个数据框。

    df1 <- melt(lst_eg_data, id.vars = names(lst_eg_data[[1]]))
    
    ggplot(df1, aes(x = LL, y = L1, fill = valColor, height = .5)) +
        scale_fill_grey() +
        geom_tile(show.legend = FALSE)
    

    【讨论】:

    • 非常感谢!我实际上需要用户指定的颜色,但我想我可以通过使用scale_fill_manual() 来实现它。我明天试试再更新。
    • 我也遇到了这个问题。不幸的是,我无法将循环信息映射到美学,因为我正在使用它来调整 geom_point(position = position_jitterdodge(jitter.width = x))) 中的抖动。还有其他建议吗?
    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多