R 使用ggplot2绘制多条法线曲线,无硬编码平均值和标准偏差

R 使用ggplot2绘制多条法线曲线,无硬编码平均值和标准偏差,r,ggplot2,dplyr,normal-distribution,mapply,R,Ggplot2,Dplyr,Normal Distribution,Mapply,我有一个均值和标准差向量,我想用ggplot2在同一个图中绘制与这些均值和标准差对应的密度。我使用了mapply和gather来解决这个问题,但是对于一些我认为应该很琐碎的东西,代码行相当多: library(dplyr) library(tidyr) library(ggplot2) # generate data my_data <- data.frame(mean = c(0.032, 0.04, 0.038, 0.113, 0.105, 0.111),

我有一个均值和标准差向量,我想用
ggplot2
在同一个图中绘制与这些均值和标准差对应的密度。我使用了
mapply
gather
来解决这个问题,但是对于一些我认为应该很琐碎的东西,代码行相当多:

library(dplyr)
library(tidyr)
library(ggplot2)

# generate data
my_data <- data.frame(mean =  c(0.032, 0.04, 0.038, 0.113, 0.105, 0.111),
                      stdev = c(0.009, 0.01, 0.01, 0.005, 0.014, 0.006), 
                      test = factor(c("Case_01", "Case_02", "Case_03", "Case_04",
                                      "Case_05", "Case_06")))

# points at which to evaluate the Gaussian densities
x <- seq(-0.05, 0.2, by = 0.001)

# build list of Gaussian density vectors based on means and standard deviations
pdfs <- mapply(dnorm, mean = my_data$mean, sd = my_data$stdev, MoreArgs = list(x = x),
               SIMPLIFY = FALSE)

# add group names
names(pdfs) <- my_data$test

# convert list to dataframe
pdfs <- do.call(cbind.data.frame, pdfs)
pdfs$x <- x

# convert dataframe to tall format
tall_df <- gather(pdfs, test, density, -x)

# build plot
p <- ggplot(tall_df, aes(color = test, x = x, y = density)) +
  geom_line() +
  geom_segment(data = my_data, aes(color = test, x = mean, y = 0, 
                                   xend = mean, yend = 100), linetype = "dashed") +
  coord_cartesian(ylim = c(-1, 100))
print(p)
库(dplyr)
图书馆(tidyr)
图书馆(GG2)
#生成数据

my_data您可以使用
purrr::pmap_df
保存一些编码,它在为每个
mean stdev
对构建数据帧后自动执行行绑定:

假设
my_data
的输入列按顺序排列,或者
mean、stdev、test
test
属于字符类

库(purrr)

很酷!你能解释一下
pmap\u df
的目标是什么吗?我不熟悉
purr
另外,我不知道您为什么要使用
.I
sintax。当然,
toll_df2
pmap_df
pmap
+
bind_rows
的一种组合,
pmap
mappy
做了类似的事情,但语法不同。因此,如果您已经将数据放在一起(在您的示例中是一个数据框),那么这将非常方便,而不是执行
mappy(f,a,b,c)
您执行
pmap(list(a,b,c),f)
。最后,它调用
bind\u rows
来保存
do.call(…,rbind)
。有关语法的更多信息,请参见
?pmap
。如果您想按名称匹配参数,您需要显式地构造一个函数
pmap\u df(我的数据,函数(平均值,stdev,test)数据\u帧(x=x,test=test,density=dnorm(x,平均值,stdev)))
!我将使用按名称匹配的方法——更具可读性,IMO,而且也不会对列的顺序进行假设。因为在实际用例中,我从磁盘读取数据,所以我不能确定列的顺序,但我知道列名。
library(purrr)
tall_df2 <- pmap_df(my_data, ~ data_frame(x = x, test = ..3, density = dnorm(x, ..1, ..2)))
my_data <- data.frame(mean =  c(0.032, 0.04, 0.038, 0.113, 0.105, 0.111),
                      stdev = c(0.009, 0.01, 0.01, 0.005, 0.014, 0.006), 
                      test = c("Case_01", "Case_02", "Case_03", "Case_04", "Case_05", "Case_06"), 
                      stringsAsFactors = F)
p <- ggplot(tall_df2, aes(color = factor(test), x = x, y = density)) + 
      geom_line() +
      geom_segment(data = my_data, aes(color = test, x = mean, y = 0, 
                                       xend = mean, yend = 100), linetype = "dashed") +
      coord_cartesian(ylim = c(-1, 100))

print(p)