【发布时间】: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