Programavimas

Kaip parašyti savo ggplot2 funkcijas R

„Tidyverse“ paketai, pvz., „Ggplot2“ ir „dplyr“, turi funkcijų sintaksę, kuri paprastai yra gana patogi: stulpelių pavadinimų nereikia dėti į kabutes. Pavyzdžiui:

dplyr :: filtras (mtcars, mpg> 30)

Atkreipkite dėmesį, kad stulpelio pavadinimas, mpg, nėra cituojamas.

Tačiau ši funkcija nebuvo naudinga, jei norite parašyti savo R funkcijas naudodamiesi „tidyverse“. Taip yra todėl, kad bazinėms R funkcijoms paprastai reikia cituojamų stulpelių pavadinimų, o tvarkinės funkcijos paprastai nėra.

Tačiau šią problemą dabar turi paprastas sprendimas dėl naujausios „rlang“ paketo versijos. Ir kad reiškia, kad labai lengva sukurti savo „ggplot“ funkcijas mėgstamiems pritaikytiems grafikams.

Leiskite man pateikti pavyzdį, naudodamas Zillow duomenis su apskaičiuotomis vidutinėmis namų vertėmis. Žemiau esančiame kode įkeliu porą paketų, nustatau savo duomenų failo pavadinimą ir naudoju bazinius R Atsisiųsti failą funkcija atsisiųsti CSV iš Zillow. Galutiniai duomenų paruošimo veiksmai: importuokite tą CSV į R ir filtruokite eilutes, kuriose Miestas yra Bostonas. (Duomenims importuoti naudoju „rio“ paketą, nes man patinka „rio“, bet jūs galite naudoti ką nors panašaus read_csv () arba duona ().) Jei sekate paskui save, nedvejodami filtruokite kitą miestą.

biblioteka (dplyr)

biblioteka (ggplot2)

# Failo pavadinimas, į kurį noriu atsisiųsti duomenis:

manofilename <- "Zillow_neighborhood_home_values.csv"

# Jei neveikia go.infoworld.com/ZillowData, visas URL yra

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

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

bos_values%

filtras (Miestas == "Bostonas")

Tada sukursiu horizontalią juostinę diagramą su tam tikrais pritaikymais, kuriuos dažnai mėgstu naudoti. Aš užsakau juostas nuo didžiausios iki mažiausios vertės, jas apibūdinu juodai, nuspalvinu mėlynai ir pakeičiu „ggplot2“ numatytąjį pilką foną.

ggplot (duomenys = bos_values, aes (x = pertvarkyti (RegionName, Zhvi), y = Zhvi)) +

geom_col (spalva = "juoda", užpildyti = "# 0072B2") +

xlab ("") +

ylab ("") +

ggtitle („Bostono kaimynystės„ Zillow Home Value Index “) +

theme_classic () +

tema (plot.title = element_text (dydis = 24)) +

coord_flip ()

Ką daryti, jei norėčiau sukurti savo funkciją, kad galėčiau greitai sukurti tokį grafiką su bet kokiu duomenų rėmeliu? Tiksliau, funkcija su duomenų rėmelio pavadinimo, stulpelio x, y stulpelio ir diagramos pavadinimo įvesties argumentais?

Žemiau yra vienas bandymas sukurti funkciją, vadinamą mybarplot su norimais pritaikymais nenaudojant paketo „rlang“. Tačiau tai neveiks.

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

ggplot (duomenys = mydf, aes (x = pertvarkyti (myxcol, myycol), y = myycol)) +

geom_col (spalva = "juoda", užpildyti = "# 0072B2") +

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (dydis = 24))

}

Aš jums parodysiu, kas nutiks, jei bandysiu iškviesti tą funkciją naudodamas necituotus stulpelių pavadinimus. Pavyzdžiui:

mybarplot (bos_values, RegionName, Zhvi,

„Zillow“ namų vertės indeksas pagal Bostono kaimynystę “)

Rezultatas - gaunu klaidą, kaip matote aukščiau pateiktame vaizdo įraše. Jeigu aš iškvieskite funkciją cituojamais stulpelių pavadinimais, gausiu grafiką, bet ne norimą grafiką.

Sharon Machlis,

Taip yra dėl to, kad bazės R klausimui reikia cituotų stulpelių pavadinimų, o „ggplot“ nereikia.

Senesnėse „rlang“ paketo versijose tam buvo daugiapakopis sprendimas, kaip aprašiau ankstesnėje „Do More With R“ („Padaryk daugiau su R“) „Tidy Eval in R.“ epizode. srovė „Rlang“ versija išsprendžia problemą su nauju operatoriumi, vadinamu tvarkingu vertinimo operatoriumi - dvigubais garbanotais petnešomis. Jūs tiesiog uždėjote garbanotas petnešas aplink necituojamus stulpelių pavadinimus savo funkcijos viduje, ir viskas!

Atminkite, kad jums reikia bent jau paketo „rlang“ 0.4.0 versijos, kad tai veiktų. Tuo metu, kai rašiau šį straipsnį, 0.4.0 versija buvo CRAN, bet jums reikėjo ją sukompiliuoti iš šaltinio, kai diegimo metu suteikta ši parinktis, bent jau „Mac“.

Žemiau esančiame kode aš įkeliu rangą ir pakoreguoju savo juostos siužeto funkciją, todėl kiekvieną kartą, kai ggplot nurodau stulpelio pavadinimą, jį apgaubiu dvigubais garbanotais petnešomis - „garbanotas garbanotas“ yra tai, kaip paketų kūrėjai nurodo.

biblioteka (rlang)

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

ggplot2 :: ggplot (duomenys = mydf, aes (x = pertvarkyti ({{myxcol}},

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

geom_col (spalva = "juoda", užpildyti = "# 0072B2") +

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (dydis = 24))

}

Dabar galiu paskambinti savo funkcija

mybarplot (bos_values, RegionName, Zhvi,

„Zillow“ namų vertės indeksas pagal Bostono kaimynystę “)

Kaip ir naudojant „tidyverse“ funkcijas, stulpelių pavadinimų dėti kabutėse nereikėjo. Tai sukuria grafiką, panašų į žemiau pateiktą

Sharon Machlis,

Aš vis dar galiu patobulinti savo funkcijos sukurtą grafiką, naudodamas kitas „ggplot“ komandas. Kitame kodo bloke aš išsaugoju grafiką, sukurtą pagal pasirinktinę funkciją, kintamajame ir tada dar keletą pakeitimų. geom_text () kodas rodo kiekvienos juostos vidutinę vertę ir tema () nustato grafiko antraštės dydį.

mygraph <- mybarplot (bos_values, RegionName, Zhvi,

„Zillow“ namų vertės indeksas pagal Bostono kaimynystę “)

mygraph +

geom_text (aes (etiketė = svarstyklės :: kablelis (Zhvi, priešdėlis = "$")),

hjust = 1.0, spalva = "balta", pozicija = position_dodge (.9), dydis = 4) +

tema (plot.title = element_text (dydis = 24))

Naujas grafikas atrodys taip:

Sharon Machlis,

Norėdami gauti daugiau R patarimų, eikite į „Do More With R“ puslapį arba „YouTube“ grojaraštį „Do More With R“.