R에서 자신 만의 ggplot2 함수를 작성하는 방법

ggplot2 및 dplyr과 같은 Tidyverse 패키지에는 일반적으로 매우 편리한 함수 구문이 있습니다. 열 이름을 따옴표로 묶을 필요가 없습니다. 예를 들면 : 

dplyr :: filter (mtcars, mpg> 30)

열 이름 인 mpg는 따옴표가 없습니다.

그러나 tidyverse를 사용하여 자신의 R 함수를 작성하려는 경우 해당 기능은 편리하지 않았습니다. 기본 R 함수는 일반적으로 인용 된 열 이름이 필요하지만 tidyverse 함수는 일반적으로 필요하지 않기 때문입니다.

그러나이 문제는 rlang 패키지의 최신 버전 덕분에 이제 간단한 해결책을 가지고 있습니다. 그리고 있다는 의미는 매우 쉽게 좋아하는 사용자 정의 그래프에 대한 자신 ggplot 기능을 만들 수 있습니다.

집값 중앙값을 추정 한 Zillow의 데이터를 사용하여 예제를 살펴 보겠습니다. 아래 코드에서 두 개의 패키지를로드하고 데이터 파일 이름을 설정하고 base R의 download.file기능을 사용 하여 Zillow에서 CSV를 다운로드합니다. 최종 데이터는 단계 수험 : R로 가져와야 CSV 행 필터링은 여기서 City이다 Boston. (저는 rio를 좋아하기 때문에 데이터 가져 오기에 rio 패키지를 사용하고 있지만 read_csv()또는 같은 다른 것을 사용할 수 있습니다 fread().) 따라가는 경우 다른 도시를 자유롭게 필터링하십시오.

도서관 (dplyr)

라이브러리 (ggplot2)

# 데이터를 다운로드 할 파일 이름 :

myfilename <- "Zillow_neighborhood_home_values.csv"

# go.infoworld.com/ZillowData가 작동하지 않는 경우 전체 URL은

# //files.zillowstatic.com/research/public/Neighborhood/Neighborhood_Zhvi_Summary_AllHomes.csv

download.file ( "// go.infoworld.com/ZillowData", myfilename)

bos_values ​​%

filter (도시 == "보스턴")

다음으로, 자주 사용하는 몇 가지 사용자 지정이 포함 된 가로 막대 차트를 만듭니다. 나는 가장 높은 값에서 가장 낮은 값으로 막대를 정렬하고, 검은 색으로 윤곽을 표시하고, 파란색으로 채색하고, ggplot2 기본 회색 배경을 변경합니다.

ggplot (data = bos_values, aes (x = reorder (RegionName, Zhvi), y = Zhvi)) +

geom_col (색상 = "검은 색", fill = "# 0072B2") +

xlab ( "") +

ylab ( "") +

ggtitle ( "보스턴 지역별 Zillow 주택 가치 지수") +

theme_classic () +

theme (plot.title = element_text (size = 24)) +

coord_flip ()

데이터 프레임에서 이와 같은 그래프를 빠르게 생성하기 위해 자체 함수를 만들고 싶다면 어떻게해야합니까? 더 구체적으로, 데이터 프레임 이름, x 열, y 열 및 그래프 제목의 입력 인수가있는 함수? 

아래는 mybarplotrlang 패키지를 사용하지 않고 원하는 사용자 정의로 호출되는 함수를 생성하려는 시도 입니다. 그러나 작동하지 않습니다.

mybarplot <-function (mydf, myxcol, myycol, mytitle) {

ggplot (데이터 = mydf, aes (x = reorder (myxcol, myycol), y = myycol)) +

geom_col (색상 = "검은 색", fill = "# 0072B2") +

xlab ( "") +

ylab ( "") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

테마 (plot.title = element_text (크기 = 24))

}

인용되지 않은 열 이름을 사용하여 해당 함수를 호출하려고하면 어떻게되는지 보여 드리겠습니다. 예를 들면 : 

mybarplot (bos_values, RegionName, Zhvi,

"보스턴 이웃에 의한 Zillow 주택 가치 지수")

결과는 위의 비디오에서 볼 수 있듯이 오류가 발생합니다. 나는 경우  가 아니라 내가 원하는 그래프 - 인용 열 이름을 가진 함수를 호출, 나는 그래프를 얻을.

Sharon Machlis,

이는 기본 R에 인용 된 열 이름이 필요하지만 ggplot은 필요하지 않기 때문입니다.

이전 버전의 rlang 패키지에는이를위한 다단계 솔루션이있었습니다. 이전 에피소드 인 "Do More With R", "Tidy Eval in R"에서 다루었습니다. 현재 이중 중괄호 - rlang로 해결할 수있는 문제의 버전은 새로운 운영자의 문제는 깔끔 평가 연산자라고합니다. 함수 내에서 인용되지 않은 열 이름을 중괄호로 묶으면 완료됩니다!

이 작업을 수행하려면 rlang 패키지 버전 0.4.0 이상이 필요합니다. 이 기사를 작성했을 때 버전 0.4.0은 CRAN에 있었지만 설치 중에 해당 옵션이 주어 졌을 때 소스에서 컴파일해야했습니다. 적어도 Mac에서는 그렇습니다.

아래 코드에서 rlang을로드하고 막대 플롯 함수를 조정하여 ggplot 내에서 열 이름을 참조 할 때마다 이중 중괄호로 묶습니다. "curly curly"는 패키지 작성자가 참조하는 방법입니다. 

도서관 (rlang)

mybarplot <-function (mydf, myxcol, myycol, mytitle) {

ggplot2 :: ggplot (data = mydf, aes (x = reorder ({{myxcol}},

{{myycol}}), y = {{myycol}})) +

geom_col (색상 = "검은 색", fill = "# 0072B2") +

xlab ( "") +

ylab ( "") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

테마 (plot.title = element_text (크기 = 24))

}

이제 내 함수를 다음과 같이 호출 할 수 있습니다.

mybarplot (bos_values, RegionName, Zhvi,

"보스턴 이웃에 의한 Zillow 주택 가치 지수")

tidyverse 함수와 마찬가지로 열 이름을 따옴표로 묶을 필요가 없습니다. 아래와 같은 그래프를 생성합니다.

Sharon Machlis,

다른 ggplot 명령을 사용하여 내 함수로 만든 그래프를 여전히 조정할 수 있습니다. 다음 코드 블록에서는 사용자 지정 함수로 만든 그래프를 변수에 저장 한 다음 추가 변경을 수행합니다. 이 geom_text()코드는 각 막대에 중앙값을 표시하고 theme()그래프 헤드 라인 크기를 설정합니다.

mygraph <-mybarplot (bos_values, RegionName, Zhvi,

"보스턴 이웃에 의한 Zillow 주택 가치 지수")

마이 그래프 +

geom_text (aes (label = scales :: comma (Zhvi, prefix = "$")),

hjust = 1.0, colour = "white", 위치 = position_dodge (.9), 크기 = 4) +

테마 (plot.title = element_text (크기 = 24))

새 그래프는 다음과 같습니다.

Sharon Machlis,

더 많은 R 팁을 보려면의 "Do More With R"페이지 또는 YouTube의 "Do More With R"재생 목록을 참조하십시오.