gpt4 book ai didi

r - 如何在 ggplot2 中绘制函数族

转载 作者:行者123 更新时间:2023-12-01 23:43:12 24 4
gpt4 key购买 nike

我需要绘制一组根据一组参数变化的函数,例如一组取决于均值和标准差的正态分布曲线。我发现here ,几乎可以完成任务的代码片段:

p9 <- ggplot(data.frame(x = c(0, 1)), aes(x = x)) +
stat_function(fun = dnorm, args = list(0.2, 0.1),
aes(colour = "Group 1")) +
stat_function(fun = dnorm, args = list(0.7, 0.05),
aes(colour = "Group 2")) +
scale_x_continuous(name = "Probability",
breaks = seq(0, 1, 0.2),
limits=c(0, 1)) +
scale_y_continuous(name = "Frequency") +
ggtitle("Normal function curves of probabilities") +
scale_colour_brewer(palette="Accent") +
labs(colour = "Groups")
p9

在本例中,代码恰好绘制了两条曲线,如下所示:

two curves

我的问题是族中的曲线数量可以是任意,因此我尝试按如下方式调整代码:

aa <- list(list(0.2, 0.1), list(0.7, 0.05), list(0.45, 0.2))
p9 <- ggplot(data.frame(x = c(0, 1)), aes(x = x))
for (i in 1:3) {
p9 <- p9 + stat_function(fun = dnorm, args = aa[[i]],
aes(colour = paste("Group", i))
}
p9 <- p9 +
scale_x_continuous(name = "Probability",
breaks = seq(0, 1, 0.2),
limits=c(0, 1)) +
scale_y_continuous(name = "Frequency") +
ggtitle("Normal function curves of probabilities") +
scale_colour_brewer(palette="Accent") +
labs(colour = "Groups")
p9

结果几乎是成功的,因为它描绘了这三条曲线,只是它没有通过颜色或图例来区分它们,如下所示:

any number of curves

我猜问题出在函数 aes() 管理其参数的方式上。您知道如何重写我的代码吗?

最佳答案

将列表添加到ggplot

快速编辑:我刚刚了解到an idiom I just learned from @BrodieG这在这里非常适用:您可以将几何或统计信息列表直接添加到 ggplot 调用中,这样您就可以避免 lapply 的 Reduce 卷积code> 甚至是 Map,它可以让您并行传递任意数量的变量。结合 @JulioSergio 的 aes_ 方法,您可以获得一个不错的图,其中包含易于定制的可读代码:

ggplot(data.frame(x = 0:1), aes(x)) + 
Map(function(params, name){stat_function(mapping = aes_(color = name),
fun = dnorm, args = params)},
params = aa,
name = paste('Group', seq_along(aa)))

<小时/>

减少

该结构非常适合将 init 设置为初始 ggplot 调用的 Reduce。可以通过按该点对象中的层数索引调色板函数来添加颜色:

Reduce(function(x, y){
x + stat_function(fun = dnorm, args = y,
colour = scales::brewer_pal('qual', 'Set1')(length(aa))[length(x$layers) + 1])},
aa,
init = ggplot(data.frame(x = c(0, 1)), aes(x = x)))

这种方法的缺点是它不能形成漂亮的图例,因为它是硬编码颜色。

<小时/>

预先计算

解决这个问题的一种方法是在绘图之前简单地进行计算,这使得绘图本身非常简单:

library(tidyverse)

aa <- list(list(0.2, 0.1), list(0.7, 0.05), list(0.45, 0.2))

aa %>% set_names(paste('Group', 1:3)) %>%
map_df(~dnorm(seq(0, 1, length = 100), .x[[1]], .x[[2]])) %>%
mutate(x = seq(0, 1, length = 100)) %>%
gather(Group, y, -x) %>%
ggplot(aes(x, y, color = Group)) +
geom_line()

关于r - 如何在 ggplot2 中绘制函数族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43462710/

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