ggplot2:根据列的函数进行分面

6
无法找到答案 -- 在 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 ~ .)

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

一种解决方法是添加一个专门用于分面的列。这个方法可行:
df$facet=df$dat>3
ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid(facet ~ .)

但是是否有一种方法可以在不向数据框添加新列的情况下完成呢?

3
添加新列有什么问题吗?我本以为添加新列会更快,因为可以利用本地R函数和向量化。 - Raffael
2
我对添加新列的主要厌恶在于它看起来不够优雅。ggplot2可以通过因素的函数处理颜色--那么分面呢?如果你想对因素的几个不同函数做这个,但不想在数据框中添加额外的列或麻烦地创建和删除它们呢? - nsheff
1
我理解你的观点 - 我也曾经有过同样的经历 - 但归根结底,这只是一个表面问题。如果你问我,尽管我很喜欢R语言,但它在设计上并不优雅 - 它的目的是完成工作,而不是优雅地完成工作。 - Raffael
1个回答

2
我想出了一个妥协解决方案,它是在评论区@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})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接