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_df2pmap_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)