如何将 facet_grid() 与 geom_histogram() 一起使用

How to use facet_grid() with geom_histogram()

我第一次尝试使用 facet_grid()。我用自己的数据绘制直方图,当我在图表上手动计算方框时,分布似乎不准确。我使用 mtcars 数据复制了我的代码,但问题似乎仍然存在。

这是 ggplot 生成的直方图:

dfrm <- mtcars
dfrm$am <- factor(dfrm$am, levels = c(0,1), labels = c("Automatic", "Manual"))
dfrm$vs <- factor(dfrm$vs, levels = c(0,1), labels = c("V-engine", "Straight-Engine"))

require(ggplot2)
ggplot(dfrm, aes(x=dfrm[,"mpg"], fill=dfrm[,"am"], colour=dfrm[,"am"])) +
geom_histogram(colour="transparent", position = "identity", alpha=0.2, bins = 10) +
facet_grid(. ~ dfrm[,"vs"])

当我在直方图上手动计数时,我计数:

此代码统计实际数据中存在多少:

require(pastecs)
by(data=dfrm$am, INDICES = dfrm$vs,  table)

结果是:

我是不是做错了什么?是否有更好的分面方式,或者这是一个错误?

我还用基本包做了直方图来检查结果是否匹配,当我数盒子的时候那些看起来是准确的。

hist(mtcars[which(mtcars[,"am"]==0 & mtcars[,"vs"]==0),"mpg"], xlim=c(10, 35), col=rgb(0.1,0.1,0.1,0.5), breaks=10)
hist(mtcars[which(mtcars[,"am"]==1 & mtcars[,"vs"]==0),"mpg"], col=rgb(0.8,0.8,0.8,0.5), breaks=10 ,add=T)
hist(mtcars[which(mtcars[,"am"]==0 & mtcars[,"vs"]==1),"mpg"], xlim=c(10, 35), col=rgb(0.1,0.1,0.1,0.5), breaks=10)
hist(mtcars[which(mtcars[,"am"]==1 & mtcars[,"vs"]==1),"mpg"], col=rgb(0.8,0.8,0.8,0.5), breaks=10 ,add=T)

谢谢。

===编辑===

bdemarest 提供的答案解决了问题。但是,我对 ggplot2 喜欢的语法以及如何将其放入函数感到困惑。 这就是我的目标:

myfunc <- function(varx, dfrm, facet = F){
  require(ggplot2)
  p = ggplot(dfrm, aes(x=varx, fill=am)) +
    geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10)
  if(!is.logical(facet)){
    p <- p + facet_grid(. ~ facet)
  }
  return(p)
}
myfunc("mpg", mtcars, facet = "vs")

我试过使用和不使用引号,但都无法正常工作。

=== EDIT2 ===

在评论中bdemarest的帮助下,我取得了很大的进步,但现在颜色填充失败,但只有当ggplot在函数内部时才会出现

在这里,这非常有效:

facet = "vs"
p = ggplot(dfrm, aes_string(x="mpg", fill="am")) +
  geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10)
if(!is.logical(facet)){
  p <- p + facet_grid(reformulate(facet, "."))
}
p

然而,这不是:

myfunc <- function(varx, dfrm, facet = FALSE){
  require(ggplot2)
  p = ggplot(dfrm, aes_string(x=varx, fill="am")) +
    geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10)
  if(!is.logical(facet)){
    p <- p + facet_grid(reformulate(facet, "."))
  }
  return(p)
}
myfunc("mpg", mtcars, facet = "vs")

现在唯一的问题是组不会相应地着色。我错过了什么?

不确定是什么导致了这个问题,但似乎可以通过清理和简化 ggplot 代码来解决。特别是,ggplot2 not 设计用于在 aes() 函数内部(也不在公式表达式中)使用列选择语法,例如 dfrm$amdfrm[, "am"]facet_wrap(. ~ dfrm[, "vs"]))。虽然这些类型的表达式通常看起来工作正常,但通常应避免使用它们。

library(ggplot2)

table(dfrm$am, dfrm$vs)
#           
#             V-engine Straight-Engine
#   Automatic       12               7
#   Manual           6               7

p = ggplot(dfrm, aes(x=mpg, fill=am)) +
    geom_histogram(position="identity", colour="grey40", alpha=0.2, bins = 10) +
    facet_grid(. ~ vs)

ggsave("hist.png", p, height=4, width=6, dpi=150)