【发布时间】:2021-04-11 19:09:05
【问题描述】:
更新 下面的代码在内核重启后运行。我留下了这个问题,因为我没有看到这种将绘图对象转换为列表并附加的确切方法。
我想动态创建一个 ggplot2::ggplot 对象 (gg) 列表并将该列表传递给 gridExtra::grid.arrange() 以绘制它们。
但是,我在尝试时遇到了错误(请参阅下面的代码底部)。
如何创建 ggplots 列表并在 grid.arrange() (或我想要一个或多个 gg 对象或 grobs 的任何地方)中使用它?
这是一个带有输出的简单示例:
# RStudio Version 1.3.1093
# R version 4.0.3 (2020-10-10)
# ggplot2 version 3.3.2
# gridExtra version 2.3
library(ggplot2)
library(gridExtra)
test_fun = function (x) {
plt_lst = list()
for(col in colnames(x)){
plt = ggplot(data = x, aes(x = x[ , col])) +
geom_histogram()
plt_lst = append(plt_lst, list(plt))
grid.arrange(plt) # Draws each graph.
print(is(plt))
# [1] "gg"
print(is(plt[[1]]))
# [1] "data.frame" "list" "oldClass" "vector"
}
return(plt_lst)
}
df = data.frame(a = rnorm(n = 50),
b = rnorm(n = 50))
test_plt_lst = test_fun(df)
print(is(test_plt_lst))
# [1] "gg"
print(is(test_plt_lst[[1]]))
# [1] "data.frame" "list" "oldClass" "vector"
# grid.arrange(test_plt_lst)
# # Error in gList(list(data = list(a = c(1.14459276559037, 2.33485713757935, : only 'grobs' allowed in "gList"
# Works
do.call(grid.arrange, test_plt_lst)
# The following error no longer appearing.
# Error in `$<-.data.frame`(`*tmp*`, "wrapvp", value = list(x = 0.5, y = 0.5, : replacement has 17 rows, data has 50
【问题讨论】:
-
使用
plt_lst = append(plt_lst, list(plt)),或者更好地放弃for/append循环并使用lappy,因为在这种情况下你仍然会遇到aes()惰性评估的问题。 -
@MrFlick,哈哈,谢谢。我一发帖就注意到了。尽管对象类型至少完好无损,但问题仍然存在。
-
好吧,那么您可能会收到不同的错误消息。你应该更新它。因为
do.call(grid.arrange, test_plt_lst)在更改后对我来说效果很好。 (尽管由于我提到的另一件事,它只打印了两次相同的图) -
是的,重启内核后它现在可以工作了。谢谢!
-
您需要向
FUN=提供一个函数,现在您正在调用一个函数并传递它的值。该值作为第一个参数传递给该函数。它应该看起来像plts = lapply(X = level_vect, FUN = function(level_str) {basic_scatter(data = data[ , level_str], x = x, y = y, ...)})
标签: r list ggplot2 gridextra grob