具有多个组的密度图

时间:2012-08-21 14:23:08

标签: r ggplot2 kernel-density

我尝试使用densityplot()在使用lattice package包使用ggplot2之后使用mice生成与require(mice) dt <- nhanes impute <- mice(dt, seed = 23109) x11() densityplot(impute) 类似的内容。这是一个可重复的例子:

bmi

产生:

densityplot output that I want to improve in ggplot

我想对输出有更多的控制(我也将它用作ggplot的学习练习)。所以,对于bar <- NULL for (i in 1:impute$m) { foo <- complete(impute,i) foo$imp <- rep(i,nrow(foo)) foo$col <- rep("#000000",nrow(foo)) bar <- rbind(bar,foo) } imp <-rep(0,nrow(impute$data)) col <- rep("#D55E00", nrow(impute$data)) bar <- rbind(bar,cbind(impute$data,imp,col)) bar$imp <- as.factor(bar$imp) x11() ggplot(bar, aes(x=bmi, group=imp, colour=col)) + geom_density() + scale_fill_manual(labels=c("Observed", "Imputed")) 变量,我尝试了这个:

invalid argument to unary operator

产生这个: enter image description here

因此有几个问题:

  1. 颜色错了。似乎我试图控制颜色完全错误/被忽略
  2. 有不需要的水平和垂直线
  3. 我希望图例显示Imputed和Observed但我的代码会显示错误densityplot(impute)
  4. 此外,用{{1}}在一行中完成的工作似乎做了很多工作 - 所以我想知道我是否可能完全以错误的方式解决这个问题?

    编辑:我应该添加第四个问题,如@ROLO所述:

    0.4。这些情节的范围似乎不正确。

2 个答案:

答案 0 :(得分:6)

使用ggplot2更复杂的原因是你使用了鼠标包中的densityplotmice::densityplot.mids来确切 - 检查它的代码),而不是格子本身。此函数具有用于绘制内置mids的{​​{1}}结果类的所有功能。如果您使用mice尝试相同的结果,您会发现它至少与使用相同的工作量GGPLOT2。

但是没有进一步的麻烦,这里是如何使用ggplot2:

lattice::densityplot

enter image description here

但正如您所看到的,这些图的范围小于require(reshape2) # Obtain the imputed data, together with the original data imp <- complete(impute,"long", include=TRUE) # Melt into long format imp <- melt(imp, c(".imp",".id","age")) # Add a variable for the plot legend imp$Imputed<-ifelse(imp$".imp"==0,"Observed","Imputed") # Plot. Be sure to use stat_density instead of geom_density in order # to prevent what you call "unwanted horizontal and vertical lines" ggplot(imp, aes(x=value, group=.imp, colour=Imputed)) + stat_density(geom = "path",position = "identity") + facet_wrap(~variable, ncol=2, scales="free") 的范围。此行为应由densityplot的参数trim控制,但这似乎不起作用。在修复stat_density的代码后,我得到了以下情节:

enter image description here

仍然与stat_density原版完全相同,但更接近。

编辑:要获得真正的修复,我们需要等待下一个主要版本的ggplot2,请参阅github

答案 1 :(得分:5)

您可以要求Hadley为此中级类添加强化方法。 E.g。

fortify.mids <- function(x){
 imps <- do.call(rbind, lapply(seq_len(x$m), function(i){
   data.frame(complete(x, i), Imputation = i, Imputed = "Imputed")
 }))
 orig <- cbind(x$data, Imputation = NA, Imputed = "Observed")
 rbind(imps, orig)
}

ggplot'在绘图之前强化'非data.frame对象

ggplot(fortify.mids(impute), aes(x = bmi, colour = Imputed, 
   group = Imputation)) +
geom_density() + 
scale_colour_manual(values = c(Imputed = "#000000", Observed = "#D55E00"))

请注意,每个都以'+'结尾。否则命令将完成。这就是传说没有改变的原因。以“+”开头的行导致错误。

enter image description here

您可以将fortify.mids的结果融合在一起绘制所有变量

library(reshape)
Molten <- melt(fortify.mids(impute), id.vars = c("Imputation", "Imputed"))
ggplot(Molten, aes(x = value, colour = Imputed, group = Imputation)) + 
geom_density() + 
scale_colour_manual(values = c(Imputed = "#000000", Observed = "#D55E00")) +
facet_wrap(~variable, scales = "free")

enter image description here