Tidyverse-pakker som ggplot2 og dplyr har en funksjonssyntaks som vanligvis er ganske hendig: Du trenger ikke å sette kolonnenavn i anførselstegn. For eksempel:
dplyr :: filter (mtcars, mpg> 30)
Merk at kolonnenavnet mpg ikke er sitert.
Denne funksjonen har ikke vært praktisk, men hvis du vil skrive dine egne R-funksjoner ved hjelp av tidyverse. Det er fordi grunnleggende R-funksjoner vanligvis trenger siterte kolonnenavn mens tidyverse-funksjoner vanligvis ikke gjør det.
Men det problemet har en enkel løsning nå, takket være den nyeste versjonen av rlang-pakken. Og at betyr at det er veldig enkelt å lage dine egne ggplot-funksjoner for dine favoritt tilpassede grafer.
La meg gå gjennom et eksempel ved å bruke data fra Zillow med estimerte medianverdier for hjemmet. I koden nedenfor laster jeg inn et par pakker, angir datafilnavnet mitt og bruker base R’er Last ned fil
funksjon for å laste ned en CSV fra Zillow. Endelige trinn for dataopprettelse: Importer CSV-en til R og filtrer etter rader hvor By
er Boston
. (Jeg bruker rio-pakken for dataimport fordi jeg elsker rio, men du kan bruke noe annet read_csv ()
eller fread ()
.) Hvis du følger med, kan du filtrere etter en annen by.
bibliotek (dplyr)bibliotek (ggplot2)
# Filnavn jeg vil laste ned data til:
minfilnavn <- "Zillow_neighborhood_home_values.csv"
# Hvis go.infoworld.com/ZillowData ikke fungerer, er full URL
# //files.zillowstatic.com/research/public/Neighborhood/Neighborhood_Zhvi_Summary_AllHomes.csv
download.file ("// go.infoworld.com/ZillowData", mitt filnavn)
bos_values%
filter (By == "Boston")
Deretter lager jeg et horisontalt søylediagram med noen tilpasninger jeg ofte liker å bruke. Jeg bestiller stolpene fra høyeste til laveste verdi, skisserer dem i svart, fargelegger dem i blått og endrer standard grå bakgrunn for ggplot2.
ggplot (data = bos_values, aes (x = ombestille (RegionName, Zhvi), y = Zhvi)) +geom_col (color = "black", fill = "# 0072B2") +
xlab ("") +
ylab ("") +
ggtitle ("Zillow Home Value Index by Boston Neighborhood") +
theme_classic () +
tema (plot.title = element_text (størrelse = 24)) +
coord_flip ()
Hva om jeg vil lage min egen funksjon for raskt å generere en graf som denne med en hvilken som helst dataramme? Mer spesifikt, en funksjon med inngangsargumenter for datarammenavnet, x-kolonnen, y-kolonnen og graftittelen?
Nedenfor er ett forsøk på å lage en funksjon som heter mybarplot
med tilpasningene jeg ønsker, uten å bruke rlang-pakken. Det vil imidlertid ikke fungere.
mybarplot <- funksjon (mydf, myxcol, myycol, mytitle) {ggplot (data = mydf, aes (x = ombestilling (myxcol, myycol), y = myycol)) +
geom_col (color = "black", fill = "# 0072B2") +
xlab ("") +
ylab ("") +
coord_flip () +
ggtitle (mytitle) +
theme_classic () +
tema (plot.title = element_text (størrelse = 24))
}
Jeg viser deg hva som skjer hvis jeg prøver å kalle den funksjonen ved hjelp av ikke siterte kolonnenavn. For eksempel:
mybarplot (bos_values, RegionName, Zhvi,"Zillow Home Value Index by Boston Neighborhood")
Resultatet er at jeg får en feil, som du kan se i videoen ovenfor. Hvis jeg ring funksjonen med siterte kolonnenavn, jeg får en graf - men ikke grafen jeg vil ha.
Sharon Machlis,Dette skyldes at base R trenger siterte kolonnenavn mens ggplot ikke gjør det.
Eldre versjoner av rlang-pakken hadde en flertrinnsløsning for dette, slik jeg dekket i en tidligere episode av "Do More With R", "Tidy Eval in R." De nåværende versjon av rlang løser problemet med en ny operatør kalt den ryddige evalueringsoperatøren - dobbel krøllete bukseseler. Du setter bare krøllete bukseseler rundt de ikke-siterte kolonnenavnene i funksjonen din, og du er ferdig!
Merk at du trenger minst versjon 0.4.0 av rlang-pakken for at dette skal fungere. Da jeg skrev denne artikkelen, var versjon 0.4.0 på CRAN, men du trengte å kompilere den fra kilden når du fikk det alternativet under installasjonen, i det minste på en Mac.
I koden nedenfor laster jeg inn rlang og tilpasser funksjonen til barplottet mitt, så hver gang jeg refererer til et kolonnenavn i ggplot, omgir jeg det med doble krøllete bukseseler - “krøllete krøllete” er slik pakkeskaperne omtaler det.
bibliotek (rlang)mybarplot <- funksjon (mydf, myxcol, myycol, mytitle) {
ggplot2 :: ggplot (data = mydf, aes (x = ombestille ({{myxcol}},
{{myycol}}), y = {{myycol}})) +
geom_col (color = "black", fill = "# 0072B2") +
xlab ("") +
ylab ("") +
coord_flip () +
ggtitle (mytitle) +
theme_classic () +
tema (plot.title = element_text (størrelse = 24))
}
Nå kan jeg ringe funksjonen min med
mybarplot (bos_values, RegionName, Zhvi,"Zillow Home Value Index by Boston Neighborhood")
Akkurat som med tidyverse funksjoner trengte jeg ikke å sette kolonnenavnene i anførselstegn. Det lager en graf som den nedenfor
Sharon Machlis,Jeg kan fortsatt tilpasse grafen som er opprettet av funksjonen min, ved hjelp av andre ggplot-kommandoer. I neste kodeblokk lagrer jeg grafen opprettet av min egendefinerte funksjon til en variabel, og gjør deretter noen flere endringer. De geom_text ()
koden viser medianverdien på hver stolpe, og tema()
angir grafens overskriftsstørrelse.
mygraph <- mybarplot (bos_values, RegionName, Zhvi,"Zillow Home Value Index by Boston Neighborhood")
mygraph +
geom_text (aes (label = skalaer :: komma (Zhvi, prefiks = "$")),
hjust = 1.0, color = "white", position = position_dodge (.9), size = 4) +
tema (plot.title = element_text (størrelse = 24))
Den nye grafen vil se slik ut:
Sharon Machlis,For flere R-tips, gå til siden "Gjør mer med R" på eller "Gjør mer med R" -spillelisten på YouTube.