如何将 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"])
当我在直方图上手动计数时,我计数:
- V 引擎,自动:14
- V引擎,手册:4
- 直列发动机,自动:5
- 直列发动机,手动:9
此代码统计实际数据中存在多少:
require(pastecs)
by(data=dfrm$am, INDICES = dfrm$vs, table)
结果是:
- V 引擎,自动:12
- V引擎,手册: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)
谢谢。
===编辑===
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$am
或 dfrm[, "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)
我第一次尝试使用 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 引擎,自动:14
- V引擎,手册:4
- 直列发动机,自动:5
- 直列发动机,手动:9
此代码统计实际数据中存在多少:
require(pastecs)
by(data=dfrm$am, INDICES = dfrm$vs, table)
结果是:
- V 引擎,自动:12
- V引擎,手册: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)
谢谢。
===编辑===
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$am
或 dfrm[, "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)