首先,当使用对数正态分布时,请记住默认是使用 自然 对数,不是 以 10 为底的对数.上图的部分问题是由于对数底数的混合。
让我们首先生成对数正态随机变量 的示例观测值,meanlog -4 和 sdlog 1,即
library(ggplot2)
library(gridExtra)
set.seed(42)
dat <- data.frame(x = rlnorm(1000, meanlog = -4, sdlog = 1))
我们将从在标准 x 轴上绘制密度开始。我将使用geom_histogram 和stat = "density" 以便缩放条形并且无需使用美学y = ..density.. 这与您的原始图非常相似,只是没有尝试缩放x 轴。
ggplot(dat) +
geom_histogram(mapping = aes(x = x), stat = "density") +
stat_function(fun = "dlnorm",
args = list(meanlog = -4, sdlog = 1),
n = 501,
color = "red")
现在,回想一下,如果
然后
log 是自然对数。
在对数刻度上绘制生成的数据示例的一种方法如下。请注意,日志转换在 geom_historgram 的映射中是显式的,并且 stat_function 使用的是 dnorm 不是 dlnorm。
ggplot(dat) +
geom_histogram(mapping = aes(x = log(x)), stat = "density") +
stat_function(fun = "dnorm",
args = list(mean = -4, sd = 1),
n = 501,
color = "red")
现在,要转换 x 轴,您需要使用 ggplot2::scale_x_continuous 和 trans = "log" 参数。当将此变换应用于图形时,x 轴的比例会被修改,stat_function 的评估将发生在变换后的 x 值上,而不是原始值上。因此,您需要定义函数以使用dnorm(log(x)),如下所示:
ggplot(dat) +
geom_histogram(mapping = aes(x = x), stat = "density") +
stat_function(fun = function(x, ...) {dnorm(log(x), ...) },
args = list(mean = -4, sd = 1),
n = 501,
color = "red") +
scale_x_continuous(trans = "log",
breaks = exp(seq(-6, 0, by = 2)),
labels = paste("exp(", seq(-6, 0, by = 2), ")"))
值得注意的是,第二张图中 x 轴刻度的标签是整数值,x 轴标签是 log(x),而在第三张图中,x 轴刻度是表达式,标签是计划“x”。确保您使用的是描述性刻度和轴标签。