gpt4 book ai didi

r - 如何以编程方式重叠 ggplot 中的任意 stat_functions?

转载 作者:行者123 更新时间:2023-12-01 07:57:35 25 4
gpt4 key购买 nike

我正在寻找一种方法来在单个 ggplot 中自动绘制任意数量的 stat_function 对象,每个对象都有一组不同的参数,并为它们着色。

最初我想有一个大数据表,其中包含来自每个分布的大量样本,每个集合与一个索引相关联,并使用 geom_density,按索引进行分组和着色。然而,这是非常低效的。在我看来,如果我们已经拥有完美描述每个分布的参数,则无需花费时间和内存来生成和保存大量值。

我在下面展示了我的初步解决方案,但是有没有更优雅和/或更实用的方法呢?


distrData.dt <- data.table( Shape = c(2.1,2.2,2.3), Scale = c(1.1,1.2,1.3), time = c(1,2,3) )

ggplot(data.table(x=c(0:15)), aes(x)) +
apply(distrData.dt,1, FUN = function(x) stat_function(fun = dgamma,arg = list(shape=as.numeric(x[1]),scale=as.numeric(x[2])), mapping = aes_string(color=x[3]) ) ) +
scale_colour_gradient("Time Step", low="blue", high="red", space="Lab")

这是当前结果: enter image description here

它会产生主要结果,也就是说,它将绘制与您提供的参数集数量一样多的“完美”密度。但是,我没有使用美学来传递列名(“Shape”和“Scale”)的参数或获取每行的颜色。据我了解,这是不可能的,但还有其他方法吗?

最佳答案

首先,您的解决方案对我来说绝对没问题:它可以完成工作,而且很优雅。我只是想扩展@joran 的评论并展示一个称为“函数工厂”的有用技巧,它非常适合像您这样的案例。

因此,我正在构建一个返回具有固定参数的函数的函数。请注意,使用 force 可以防止 shapescale 被延迟计算,这是必要的,因为我们将使用 for 循环。

我使用的是 data.frame 而不是 data.table,但应该没有显着差异。 vector("list", n) 构造是为列表预分配空间,如 ?list 所示。我不认为在这种特殊情况下这是强制性的(显着的开销会出现在长度上,比如说,>100,这里不太可能),但最好避免迭代增长对象,这是一种不好的做法。

作为最后的评论,检查 stat_function 调用:它看起来相当可读,至少您可以看到什么是映射以及什么与 dgamma 参数相关。

dgamma_factory <- function(shape, scale) {
force(shape)
force(scale)
function(x) dgamma(x, shape = shape, scale = scale)
}
l <- vector("list", nrow(distrData.dt))

for (i in seq.int(nrow(distrData.dt))) {
params <- distrData.dt[i, ]
l[[i]] <- stat_function(
fun = dgamma_factory(params$Shape, params$Scale),
mapping = aes_string(color = params$time))
}
ggplot(data.frame(x=c(0:15)), aes(x)) +
l +
scale_colour_gradient("Time Step", low="blue", high="red", space="Lab")

关于r - 如何以编程方式重叠 ggplot 中的任意 stat_functions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com