【发布时间】:2018-06-27 23:55:27
【问题描述】:
我正在尝试使用包 ggplot2 和 ggpubr 在 R 中制作复合图。 除了每个图都有特定于该数据集的正态分布曲线外,我在制作复合图时没有问题。当我生成复合图时,两个图都有相同的曲线,即最后一个数据集的曲线。
如何生成每个图都有自己特定的正态分布曲线的复合图?
代码和输出图
## PLOT 1 ##
results_matrix_C <- data.frame(matrix(rnorm(20), nrow=20))
colnames(results_matrix_C) <- c("X")
m <- mean(results_matrix_C$X)
sd <- sd(results_matrix_C$X)
dnorm_C <- function(x){
norm_C <- dnorm(x, m, sd)
return(norm_C)
}
e = 1
dnorm_one_sd_C <- function(x){
norm_one_sd_C <- dnorm(x, m, sd)
# Have NA values outside interval x in [e]:
norm_one_sd_C[x <= e] <- NA
return(norm_one_sd_C)
}
C <- ggplot(results_matrix_C, aes(x = results_matrix_C$X)) +
geom_histogram(aes(y=..density..), bins = 10, colour = "black", fill = "white") +
stat_function(fun = dnorm_one_sd_C, geom = "area", fill = "#CE9A05", color = "#CE9A05", alpha = 0.25, size = 1) +
stat_function(fun = dnorm_C, colour = "#CE0539", size = 1) +
theme_classic()
## PLOT 2 ##
results_matrix_U <- data.frame(matrix(rnorm(20)+1, nrow=20))
colnames(results_matrix_U) <- c("X")
m <- mean(results_matrix_U$X)
sd <- sd(results_matrix_U$X)
dnorm_U <- function(x){
norm_U <- dnorm(x, m, sd)
return(norm_U)
}
e = 2
dnorm_one_sd_U <- function(x){
norm_one_sd_U <- dnorm(x, m, sd)
# Have NA values outside interval x in [e]:
norm_one_sd_U[x <= e] <- NA
return(norm_one_sd_U)
}
U <- ggplot(results_matrix_U, aes(x = results_matrix_U$X)) +
geom_histogram(aes(y=..density..), bins = 10, colour = "black", fill = "white") +
stat_function(fun = dnorm_one_sd_U, geom = "area", fill = "#CE9A05", color = "#CE9A05", alpha = 0.25, size = 1) +
stat_function(fun = dnorm_U, colour = "#CE0539", size = 1) +
theme_classic()
library(ggpubr)
ggarrange(C, U,
nrow = 1, ncol = 2)
正如您在复合图中看到的那样,第一个图采用了第二个图的正态分布曲线,而不是我的初始图(图 1)中的正态分布曲线。
更新
变量“e”是指与分布曲线相关的阴影区域。 m = 数据集的平均值 sd = 数据集的标准差 m和sd用于生成正态分布曲线
【问题讨论】:
-
我认为这个问题与绘图无关,而与您定义函数的方式有关。
dnorm_C仅使用x作为参数,但它也使用m和sd。您可能需要force他们,但更好的做法是明确地传递它们 - 略读您的问题我不确定您要使用什么值(显然 R 也不确定)。关于这个主题的好读物是functional operators section of Advanced R。dnorm_one_sd_C更糟糕,它使用了一个常量e,我在任何地方都没有看到它的定义。 -
@Gregor,感谢您的回复。我已经用
dnorm_one_sd_C更新了您遇到的问题。如果问题出在功能上,能否提供一个可行的示例,以便我解决我遇到的问题。 -
问题不在于“你不解释
e是什么”,问题是你的函数使用了像e和m和sd这样没有通过的变量作为论据。我的建议是你应该将dnorm_one_sd_C <- function(x)重写为dnorm_one_sd_C <- function(x, m, sd)并将dnorm_one_sd_U <- function(x)重写为dnorm_one_sd_U <- function(x, m, sd, e)。如果您想了解为什么这是一个问题并且需要此建议,请阅读我在第一条评论中发布的链接——这里解释得太复杂了。