ggplot2奇数来自geom_density

时间:2013-03-26 02:11:52

标签: r ggplot2

我正在尝试复制条件密度图,如stat_density的文档所示,但我需要使用ggplot而不是qplot,因为我需要面对情节。但是,我的数据在每个方面都有不等数量的行,当我绘制它时,我会得到奇怪的结果。这是一个MRE:

test.df = data.frame(model=c(rep("A",100),rep("B",50),rep("C",20)),
as.factor(cnt=c(rbinom(100,1,0.5),rbinom(50,1,0.5),rbinom(20,1,0.5))),
xvar=c(seq(1,100),seq(1,50),seq(1,20)))

# This works fine, ignoring the model facets.
ggplot(test.df,aes(x=xvar,y=..count..,fill=cnt)) + geom_density(position="fill")

# Something's wrong with this one.
ggplot(test.df,aes(x=xvar,y=..count..,fill=cnt)) + geom_density(position="fill") + 
facet_wrap(~model)

以下是忽略模型的示例(如果您单独分组和绘制每个组,它看起来相同):

enter image description here

与分面:

enter image description here

对我在这里做错了什么的想法?

编辑:这是在OSX 10.8.2下的R 2.15.1 / Rstudio 0.97.314,ggplot2 0.9.3.1

1 个答案:

答案 0 :(得分:3)

问题出现是因为在推断x变量时估计密度并没有多大意义。 (model = B的极限是[0,50],而model = C的极限是[0,20]

如果您设置了scales='free_x',那么您就不会强迫ggplot做一些愚蠢的事情。

ggplot(test.df,aes(x=xvar,y=..count..,fill=cnt)) + 
 geom_density(position = "fill") + 
 facet_wrap(~model,scales = 'free_x')

enter image description here

您也可以将trim = TRUE传递给geom_density(以及stat_density),这会在计算(和绘制)密度时修剪到观察数据的范围

ggplot(test.df,aes(x=xvar,y=..count..,fill=cnt)) + 
 geom_density(position="fill",trim = TRUE) + 
 facet_wrap(~model)

enter image description here

也许应该对原始尝试中的无意义结果发出某种警告,但我认为fortune(15)

可以涵盖这一点。
library(fortunes)
fortune(15)
## It really is hard to anticipate just how silly users can be.
##   -- Brian D. Ripley
##   R-devel (October 2003)