1

我正在尝试复制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、ggplot2 0.9.3.1 下使用 R 2.15.1 / Rstudio 0.97.314

4

1 回答 1

4

x之所以出现问题,是因为在外推变量时估计密度并没有真正意义。(模型 = B 的限制为 [0,50],模型 = 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 = TRUEgeom_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)
于 2013-03-26T02:20:08.567 回答