geom_density 未正确填写 scale_y_log10

geom_density doesn't fill correctly with scale_y_log10

代码:

require(ggplot2)
set.seed(0)
xvar <- rnorm(100)
ggplot(data.frame(xvar), aes(xvar)) + geom_density(fill="lightblue") + scale_y_log10()

图表是这样的:

如何在密度估计的右侧(即下方)制作图形阴影?

这不是 ggplot2 甚至 R 问题,而只是概率分布的尾部针对您的样本量采样不足的问题。对数轴可以永远向下,无限长地到达 "reach" 零,但是有限的样本量永远不可能覆盖分布中越来越不可能的区域。

因此,为了使情节更漂亮,您需要 (a) 将点数从 100 增加到 10,000 或更高,同时 (b) 保持情节 ylim 相同。 (否则,您在 rnorm 调用中绘制的额外数据将 稀疏地 填充高斯分布的尾部,甚至离均值更远,说服 ggplot2 自动 y axis limits 甚至更低,在 poorly-sampled 尾巴的范围内,你不喜欢的噪音会 return.)

require(ggplot2)
require(scales)
set.seed(0)
xvar <- rnorm(100000)
ggplot(data.frame(xvar), aes(xvar)) + 
    geom_density(fill="lightblue") + 
    scale_y_continuous(trans=log10_trans(), limits = c(0.01, 1))

这生成了这个情节,我认为这就是你想要的。

问题是 stat_density 默认填充 转换后的 数据的密度和 y=0 行之间。因此,改变 y=0 行的转换将成为此类问题的牺牲品。我个人认为这是 ggplot2 中的错误,尽管由于图形语法专家可能认为 y 变换密度没有意义,因此该错误可能不会引起太多关注。

一个非常笨拙的解决方法是手动向 ..density.. 添加一个偏移量,您必须显式调用它,然后更改中断以使其看起来好像您没有做任何奇怪的事情。

require(ggplot2)
require(scales)
set.seed(0)
xvar <- rnorm(100000)
quartz(height=4,width=6)
ggplot(data.frame(xvar), aes(x=xvar, y=log10(..density..)+4)) + 
    geom_density(fill='lightblue') +
    scale_y_continuous(breaks=c(0,1,2,3,4), 
        labels=c('0.0001', '0.001', '0.01', '0.1','1'), limits=c(0,4),
        name='density')
quartz.save('![Whosebug_29111741_v2][1].png')

该代码生成此图: