geom_density未正确填充scale_y_log10

时间:2015-03-17 23:43:41

标签: r ggplot2 kernel-density

代码:

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

图表是这样的: badgraph

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

2 个答案:

答案 0 :(得分: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('![StackOverflow_29111741_v2][1].png')

该代码生成此图: Kludged graph

答案 1 :(得分:-1)

这不是ggplot2甚至是R问题,而只是针对您的样本规模对概率分布的尾部进行欠采样的问题。对数轴可以永久地下降,无限长时间“达到”零,但没有有限的样本大小可以希望覆盖分布中越来越不可能的区域。

因此,为了使情节更漂亮,您需要(a)将点数从100增加到10,000或更高,而(b)保持情节ylim s相同。 (否则,您在rnorm调用中绘制的额外数据将稀疏地填充高斯的尾巴,甚至更远离均值,说服ggplot2自动生成y在极差采样尾部的范围内,轴限制甚至更低,并且您不喜欢的噪声将返回。)

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

这会产生这个情节,我认为这就是你想要的。 enter image description here