我第一次尝试使用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)
感谢。
=== 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")
现在唯一的问题是这些小组不会因此而变色。我错过了什么?
答案 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)