Как да напишете собствените си функции ggplot2 в R

Tidyverse пакетите като ggplot2 и dplyr имат синтаксис на функцията, който обикновено е доста удобен: Не е нужно да поставяте имена на колони в кавички. Например: 

dplyr :: filter (mtcars, mpg> 30)

Обърнете внимание, че името на колоната, mpg, е без кавички.

Тази функция обаче не е била полезна, ако искате да напишете свои собствени R функции, като използвате tidyverse. Това е така, защото основните функции R обикновено се нуждаят от имена на цитираните колони, докато функциите tidyverse обикновено не.

Но този проблем има просто решение сега, благодарение на последната версия на пакета rlang. И това означава, че е много лесно да създадете свои собствени ggplot функции за любимите си персонализирани графики.

Позволете ми да разгледам пример, като използвам данни от Zillow с приблизителни средни начални стойности. В кода по-долу зареждам няколко пакета, задавам името на файла с данни и използвам download.fileфункцията base R, за да изтегля CSV от Zillow. Последни стъпки за подготовка на данни: Импортирайте този CSV в R и филтрирайте за редове, където 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%

филтър (Град == "Бостън")

След това ще създам хоризонтална диаграма с някои персонализации, които често обичам да използвам Поръчвам лентите от най-високите до най-ниските стойности, очертавам ги в черно, оцветявам в синьо и променям сивия фон по подразбиране ggplot2.

ggplot (данни = bos_values, aes (x = пренареждане (Име на регион, Zhvi), y = Zhvi)) +

geom_col (color = "black", fill = "# 0072B2") +

xlab ("") +

ylab ("") +

ggtitle ("Zillow Home Value Index от квартал Бостън") +

theme_classic () +

тема (plot.title = елемент_текст (размер = 24)) +

ord_flip ()

Ами ако искам да направя своя собствена функция за бързо генериране на графика като тази с всеки кадър от данни? По-конкретно, функция с входни аргументи на името на кадъра с данни, колоната x, колоната y и заглавието на графиката? 

По-долу е един опит за създаване на функция, извикана mybarplotс персонализациите, които искам, без да използвам пакета rlang. Това обаче няма да работи.

mybarplot <- функция (mydf, myxcol, myycol, mytitle) {

ggplot (данни = mydf, aes (x = пренареждане (myxcol, myycol), y = myycol)) +

geom_col (color = "black", fill = "# 0072B2") +

xlab ("") +

ylab ("") +

ord_flip () +

ggtitle (mytitle) +

theme_classic () +

тема (plot.title = element_text (размер = 24))

}

Ще ви покажа какво се случва, ако се опитам да извикам тази функция, използвайки имена на колони без кавички. Например: 

mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index от квартал Бостън")

Резултатът е, че получавам грешка, както можете да видите във видеото по-горе. Ако  извикам функцията с цитирани имена на колони, получавам графика - но не и графиката, която искам.

Шарън Маклис,

Това се дължи на проблема с базовия R, който се нуждае от имена на цитирани колони, докато ggplot не.

По-старите версии на пакета rlang имаха многоетапно решение за това, както разгледах в един по-ранен епизод на „Направи повече с R“, „Tidy Eval in R.“ В текущата версия на rlang решава проблема с нов оператор, наречен подредено оператора оценка - двойни фигурни скоби. Просто поставяте къдравите скоби около нецитираните имена на колони във вашата функция и готово!

Имайте предвид, че ви трябва поне версия 0.4.0 на пакета rlang, за да работи това. По времето, когато писах тази статия, версия 0.4.0 беше на CRAN, но трябваше да я компилирате от източник, когато тази опция е дадена по време на инсталацията, поне на Mac.

В кода по-долу зареждам rlang и ощипвам функцията си за графика на лентата, така че всеки път, когато се позова на име на колона в ggplot, аз го обграждам с двойни фигурни скоби - „curly curly“ е начинът, по който създателите на пакети се отнасят до него. 

библиотека (rlang)

mybarplot <- функция (mydf, myxcol, myycol, mytitle) {

ggplot2 :: ggplot (данни = mydf, aes (x = пренареждане ({{myxcol}}),

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

geom_col (color = "black", fill = "# 0072B2") +

xlab ("") +

ylab ("") +

ord_flip () +

ggtitle (mytitle) +

theme_classic () +

тема (plot.title = element_text (размер = 24))

}

Сега мога да извикам функцията си с

mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index от квартал Бостън")

Точно както при функциите tidyverse, не трябваше да поставям имената на колоните в кавички. Създава графика като тази по-долу

Шарън Маклис,

Все още мога да оправя графиката, създадена от моята функция, като използвам други команди ggplot. В следващия блок код запазвам графиката, създадена от моята персонализирана функция, в променлива и след това правя някои промени. На geom_text()код се показва средната стойност на всяка лента, и theme(), определя графика заглавие размер.

mygraph <- mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index от квартал Бостън")

mygraph +

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

hjust = 1.0, color = "white", position = position_dodge (.9), size = 4) +

тема (plot.title = element_text (размер = 24))

Новата графика ще изглежда така:

Шарън Маклис,

За повече съвети за R отидете на страницата „Направете повече с R“ в или плейлиста „Направете повече с R“ в YouTube.