변수를 사용하여 ggplot에서 열 이름을 지정하는 방법


105

ggplot 명령이 있습니다.

ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )

함수 내부. 그러나 함수의 매개 변수를 사용하여 색상 및 그룹으로 사용할 열을 선택하고 싶습니다. Ie 이런 걸 원해요

f <- function( column ) {
    ...
    ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}

따라서 ggplot에서 사용되는 열은 매개 변수에 의해 결정됩니다. 예를 들어 f ( "majr")의 경우 다음과 같은 효과를 얻습니다.

ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )

그러나 f ( "gender")의 경우

  ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )

내가 시도한 몇 가지 :

ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )

작동하지 않았다. 하지 않았다

e <- environment() 
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )

답변:


161

다음을 사용할 수 있습니다 aes_string.

f <- function( column ) {
    ...
    ggplot( rates.by.groups, aes_string(x="name", y="rate", colour= column,
                                        group=column ) )
}

열을 함수에 문자열로 전달하는 한 ( f("majr")대신 f(majr)). 또한 우리는 다른 열을 변경, 참고 "name""rate"문자열로.

어떤 이유로 든을 사용하지 않으려면 다음 aes_string과 같이 변경할 수 있습니다.

    ggplot( rates.by.groups, aes(x=name, y=rate, colour= get(column),
                                        group=get(column) ) )

해서는 안된다 /하지 말아야한다고 말할 가치가 aes_string(x = rates.by.groups$name...있으며, 어쨌든 이미 ggplot(data = rates.by.groups...인수를 통과했기 때문에 그럴 필요가 없습니다 . (의 문제가 이 질문에 )
SMCI

3
그냥 ggplot2 버전 3.0.0 업데이트와 Moody_Mudskipper의 대답에 포인트 사람들에게 메모를 추가
그레고르 토마스

즉, 인용, 사실이 아니다 @buncis "column_name"또는 "column"작업하고자하지
데이비드 로빈슨

@DavidRobinson 미안 내 실수, 나는 코드가 내 댓글을 삭제거야, 매개 변수와 함수에 싸여 보이지 않는
buncis

"성가신"? R의 비표준 평가는 역설적이게도 프로그래밍 언어에서 내가 본 것 중 가장 번거로운 "기능"입니다. 정말 미친 짓이야.
jessexknight

44

릴리스 노트 에서 ggplot2 V3.0.0:

aes ()는 이제 !!, !!! 및 : =를 사용할 수 있도록 쿼시 쿼트를 지원합니다. 이는 현재 소프트 사용되지 않는 aes_ () 및 aes_string ()을 대체합니다 (그러나 오랫동안 유지 될 것입니다).

관용적 인 방법은 이제 변수에 포함 된 문자열을 기호로 변환하고 sym()(기본 별칭 as.name()/ 과 거의 동일 as.symbol())을 사용하여 인용을 해제하는 것입니다.!!

우리가 할 수있는 OP 데이터 시뮬레이션 :

library(tidyverse)
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4,4,5)],
  gender = c("M","F","F")
)

f <- function(column) {
  column <- sym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

f("gender")
f("mjr")
x <- "gender"
f(x)

함수에 원시 이름을 제공하려면 다음을 수행 할 수 있습니다.

f2 <- function(column) {
  column <- ensym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

이름 일명 기호 및 문자열 리터럴과 함께 작동합니다.

f2(gender)
f2(mjr)
f2("gender")
f2("mjr")

Lionel은 ensym()다음과 같이 말합니다 .

LHS에서 둘 다 제공 할 수있는 인수 구문을 모방하기위한 것입니다. 예 : list (bare = 1, "quoted"= 2)


참고 사항 enquo()

enquo()인수에 제공된 표현식 (반드시 기호 일 필요는 없음)을 인용합니다. 문자열 리터럴을 기호로 변환 ensym()하지 않으므로 여기서 덜 적응 될 수 있지만 다음과 같이 할 수 있습니다.

f3 <- function(column) {
  column <- enquo(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

f3(gender)
f2(mjr)

12
깔끔한 물건은 너무 짜증납니다. 문서 aes()자체에 대해 이야기 enquo()하지만 작동하지 않습니다. 그리고 ensym()전에 들어 본 적이 있습니까? BIG SIGH
CoderGuy123

@Moody_Mudskipper의 경우 f2네 가지 예제가 모두 작동하며 변수 (예 :) 에서 열 이름을 캡처합니다 aname <- "mjr"; f2(aname). 데이터 프레임을 조작하는 코드를 추가 dplyr하면 변수 이름의 문자열이 아닌 변수 이름을 사용하여 열을 찾으려고합니다. 즉, 어떻게 rates.by.groups %>% group_by(!!column)...일하러 가면서 세 가지 전화 방법을 지원 f2합니까?
steveb

1
"변수에서 열 이름을 캡처하는 경우도 마찬가지입니다.": 실패하지는 않지만 동일한 결과를 반환하지 않으며 ensym이름으로 제공된 인수를 처리하고 그 주위에 따옴표를 허용하도록 설계되었습니다. 나는 당신이 인수를 이름으로 취급하고 이름이 발견되지 않으면 값으로 돌아가고 싶다고 믿습니다. 이것은 실제로에서 일어나는 일 select이지만 group_by에서는 그렇지 않습니다. 해킹은 가능하지만 명확하지는 않습니다. 그것이 당신에게 중요하다면 자체 질문을 할 가치가 있다고 생각합니다.
Moody_Mudskipper

@Moody_Mudskipper 감사합니다. 나는 둘 다 사용 select하고 group_by있었기 때문에 문제 일 가능성이 큽니다. 새로운 질문을 만들 수는 있지만 간단한 예를 제시하고 답변이되었는지 확인해야합니다. 그렇지 않으면 게시 할 수 있습니다.
steveb

사용하는 방법 !! 의 경우 facet_grid? 작동 facet_grid(cols = vars(!!column))하지만 오류가 발생합니다facet_grid(~ !!column)
mRiddle

14

aes_string대신을 사용해보십시오 aes.


5
이것은 훌륭한 조언이지만 이유를 말할 수 있습니까? aes_string을 사용하면 비 변수에 ""를 사용하고 따옴표없이 변수를 사용합니다. aes_string (x = "foo", y = "fee", group = variable)
mtelesha

변수의 값으로 문자열을 가지고 @mtelesha 어쩌면 때문에
buncis

10

또 다른 옵션 ( ggplot2 > 3.0.0)은 데이터 프레임 .data에서 선택한 변수 / 열을 분리 하기 위해 깔끔한 평가 대명사를 사용하는 것 rates.by.groups입니다.

library(ggplot2)
theme_set(theme_classic(base_size = 14))

# created by @Moody_Mudskipper
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4, 4, 5)],
  gender = c("M", "F", "F")
)

f1 <- function(df, column) {
  gg <- ggplot(df, 
         aes(x = name, 
             y = rate, 
             fill  = .data[[column]], 
             group = .data[[column]])) +
    geom_col() +
    labs(fill = column)
  return(gg)
}

plot_list <- lapply(list("gender", "mjr"), function(x){ f1(rates.by.groups, x) })
plot_list
#> [[1]]

#> 
#> [[2]]

# combine all plots
library(egg)
ggarrange(plots = plot_list,
          nrow = 2,
          labels = c('A)', 'B)'))

2019-04-04에 reprex 패키지 (v0.2.1.9000)로 생성됨


1

를 사용하면 aes_string이 문제가 해결되지만 오차 막대를 추가 할 때 문제가 발생합니다 geom_errorbar. 아래는 간단한 해결책입니다.

#Identify your variables using the names of your columns indie your dataset
 xaxis   <- "Independent"   
 yaxis   <- "Dependent"
 sd      <- "error"

#Specify error bar range (in 'a-b' not 'a'-'b')
 range   <- c(yaxis, sd)                                #using c(X, y) allows use of quotation marks inside formula
 yerrbar <- aes_string(ymin=paste(range, collapse='-'), 
                       ymax=paste(range, collapse='+'))


#Build the plot
  ggplot(data=Dataset, aes_string(x=xaxis, y=yaxis)) +
    geom_errorbar(mapping=yerrbar, width=15, colour="#73777a", size = 0.5) +
    geom_point   (shape=21)

또한 ggplot 내에서 다음 줄을 사용하여 플롯에 패싯을 추가 할 수도 있습니다.

facet_grid(formula(paste(Variable1, "~", Variable2)))

이 스크립트는 원본 게시물에서 수정되었습니다 : ggplot2-사용자 지정 함수를 사용하는 오류 막대


0

다음은 매우 간단한 예입니다.

두 가지만 해

  1. 문자열을 상징으로 바꾸기
  2. !!사용할 때 추가
select_col <- sym("Petal.Length")

iris %>% 
  ggplot(aes(x = Sepal.Length, y = !!select_col)) +
  geom_point()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.