2013-11-21 57 views
6

找不到對此的答案 - 在ggplot2中,是否可以面向列的一個函數,而不是直接列的值?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 ~ .) 

但有沒有辦法做到這一點,而無需添加一個新的列data.frame?

+3

添加新列時出現了什麼問題?我寧願期待添加新列的速度更快,因爲它利用了原生R函數和矢量化。 – Raffael

+2

我對添加新專欄的主要反感僅僅是它看起來不夠雅緻。 ggplot2可以通過一個因素的函數來處理着色 - 刻面怎麼樣?如果你想在一個因素的幾個不同功能上做到這一點,但不會混淆你的數據框與額外的列,或麻煩創建和刪除它們? – nsheff

+1

我明白你的觀點 - 我也曾經在那裏 - 但在一天結束的時候,這只是一個美好的問題,如果你問我,就像我喜歡R一樣,這是一種設計上不雅的語言 - 它的目的是讓工作順利完成,但不夠優雅。 – Raffael

回答

2

我已經想出了一個折中的解決方案,這是@Nathan和@Яaffel在評論部分發布的參數之間的權衡。

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