R ggplot2:柱函数上的刻面

R ggplot2:柱函数上的刻面,r,ggplot2,facet,R,Ggplot2,Facet,找不到这个问题的答案——在ggplot2中,是否可以在列的函数上刻面,而不是直接在列的值上刻面 简单的可复制示例: 样本数据: df=data.frame(dat=c(1,2,5,5,7)) 这项工作: ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + geom_point() + facet_grid(dat ~ .) df$facet=df$dat>3 ggplot(df, aes(x=1:5, y

找不到这个问题的答案——在ggplot2中,是否可以在列的函数上刻面,而不是直接在列的值上刻面

简单的可复制示例:

样本数据:

df=data.frame(dat=c(1,2,5,5,7))
这项工作:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid(dat ~ .)
df$facet=df$dat>3
ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid(facet ~ .)
这并不是:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid((dat > 3) ~ .)
一种解决方案是只为facet添加一列。这项工作:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid(dat ~ .)
df$facet=df$dat>3
ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid(facet ~ .)

但是有没有一种方法不必在data.frame中添加新的列就可以做到这一点呢?

我想出了一个折衷的解决方案,即在评论部分发布的@Nathan和@Яaffael的论点之间进行折衷

FacetingFunction <- function(df) {df$dat > 3}
ArbitraryFacetingPlot <- function(df, FacetingFunction) {
  df$facet <- FacetingFunction(df)
  p <- ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
    geom_point() + 
    facet_grid(facet ~ .)
  df$facet <- NULL
  p
}

ArbitraryFacetingPlot(df, FacetingFunction)
ArbitraryFacetingPlot(df, function(df) {df$dat==5})
FacetingFunction 3}

ArbiraryFacetingPlot添加新列有什么问题?我更希望添加一个新列更快,因为它利用了原生R函数和向量化。我对添加一个新列的主要反感是它看起来不雅观。ggplot2可以通过一个因子的函数来处理着色——那么刻面呢?如果你想在一个factor的几个不同函数上这样做,但又不想用额外的列来扰乱你的数据帧,或者费心创建和删除它们,那该怎么办呢?我明白你的意思——我也去过——但最终这只是一个美容问题,如果你问我,尽管我很喜欢R,这是一种设计上不雅观的语言——它的目的是把工作做好,但不是优雅地完成。