2013-11-21 1 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과 @ Я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})