代码:
require(ggplot2)
set.seed(0)
xvar <- rnorm(100)
ggplot(data.frame(xvar), aes(xvar)) + geom_density(fill="lightblue") + scale_y_log10()
图表是这样的:
如何在密度估算的右侧(即下方)制作图形阴影?
答案 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')
该代码生成此图:
答案 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))
这会产生这个情节,我认为这就是你想要的。