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

时间:2017-04-14 16:44:42

标签: r ggplot2 histogram facet

我第一次尝试使用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"])

当我手动计算直方图时,我会计算:

  • V-Engine,自动:14
  • V-Engine,Manual:4
  • 直引擎,自动:5
  • 直引擎,手册:9

此代码计算实际数据中存在的代码数量:

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

结果是:

  • V-Engine,Automatic:12
  • V-Engine,Manual:6
  • 直引擎,自动:7
  • 直引擎,手册:7

我做错了吗?是否有更好的方法,或者这是一个错误吗?

我还使用基础包进行了直方图检查结果是否匹配,当我计算这些框时,这些似乎是准确的。

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)

感谢。

=== EDIT ===

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")

现在唯一的问题是这些小组不会因此而变色。我错过了什么?

1 个答案:

答案 0 :(得分:1)

不确定导致此问题的原因,但似乎可以通过清理和简化ggplot代码来解决。特别是,ggplot2 旨在使用dfrm$am函数内部的dfrm[, "am"]aes()等列选择语法(也不会使用facet_wrap(. ~ dfrm[, "vs"])之类的公式表达式1}})。虽然这些类型的表达似乎通常很好,但通常应该避免使用它们。

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)

enter image description here