我正在尝试复制条件密度图,如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)
以下是忽略模型的示例(如果您单独分组和绘制每个组,它看起来相同):
与分面:
对我在这里做错了什么的想法?
编辑:这是在OSX 10.8.2下的R 2.15.1 / Rstudio 0.97.314,ggplot2 0.9.3.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')
您也可以将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)
也许应该对原始尝试中的无意义结果发出某种警告,但我认为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)