Programmering

Sådan skriver du dine egne ggplot2-funktioner i R

Tidyverse-pakker som ggplot2 og dplyr har en funktionssyntaks, der normalt er ret praktisk: Du behøver ikke sætte kolonnenavne i anførselstegn. For eksempel:

dplyr :: filter (mtcars, mpg> 30)

Bemærk, at kolonnenavnet mpg ikke er citeret.

Denne funktion har dog ikke været praktisk, hvis du vil skrive dine egne R-funktioner ved hjælp af tidyverse. Det skyldes, at base R-funktioner normalt har brug for citerede kolonnenavne, mens tidyverse-funktioner generelt ikke gør det.

Men dette problem har en enkel løsning nu takket være den nyeste version af rlang-pakken. Og at betyder, at det er meget nemt at oprette dine egne ggplot-funktioner til dine foretrukne tilpassede grafer.

Lad mig gennemgå et eksempel ved hjælp af data fra Zillow med estimerede medianværdier. I nedenstående kode indlæser jeg et par pakker, indstiller mit datafilnavn og bruger base R'er download fil funktion til at downloade en CSV fra Zillow. Afsluttende dataforberedelsestrin: Importer CSV til R og filtrer efter rækker hvor By er Boston. (Jeg bruger rio-pakken til dataimport, fordi jeg elsker rio, men du kan bruge noget andet som read_csv () eller fread ().) Hvis du følger med, er du velkommen til at filtrere efter en anden by.

bibliotek (dplyr)

bibliotek (ggplot2)

# Filnavn, som jeg vil downloade data til:

myfilename <- "Zillow_neighborhood_home_values.csv"

# Hvis go.infoworld.com/ZillowData ikke virker, er den fulde URL

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

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

bos_values%

filter (By == "Boston")

Derefter opretter jeg et vandret søjlediagram med nogle tilpasninger, som jeg ofte kan lide at bruge. Jeg bestiller bjælkerne fra de højeste til de laveste værdier, skitserer dem i sort, farver dem i blåt og ændrer ggplot2-standardgrå baggrund.

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

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

xlab ("") +

ylab ("") +

ggtitle ("Zillow Home Value Index by Boston Neighborhood") +

theme_classic () +

tema (plot.title = element_text (størrelse = 24)) +

coord_flip ()

Hvad hvis jeg gerne vil lave min egen funktion til hurtigt at generere en graf som denne med en hvilken som helst dataramme? Mere specifikt, en funktion med inputargumenter for datarammenavnet, x-kolonnen, y-kolonnen og graftitlen?

Nedenfor er et forsøg på at oprette en funktion kaldet mybarplot med de tilpasninger, jeg ønsker, uden at bruge rlang-pakken. Det fungerer dog ikke.

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

ggplot (data = mydf, aes (x = ombestilling (myxcol, myycol), y = myycol)) +

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (størrelse = 24))

}

Jeg viser dig, hvad der sker, hvis jeg prøver at kalde den funktion ved hjælp af ikke-citerede kolonnenavne. For eksempel:

mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index by Boston Neighborhood")

Resultatet er, at jeg får en fejl, som du kan se i videoen ovenfor. Hvis jeg kalde funktionen med citerede kolonnenavne, jeg får en graf - men ikke den graf, jeg ønsker.

Sharon Machlis,

Dette skyldes problemet med base R, der har brug for citerede kolonnenavne, mens ggplot ikke gør det.

Ældre versioner af rlang-pakken havde en flertrinsløsning til dette, som jeg dækkede i en tidligere episode af "Gør mere med R", "Tidy Eval i R." Det nuværende version af rlang løser problemet med en ny operatør kaldet den tidy evaluering operator - dobbelt krøllede seler. Du lægger bare de krøllede seler omkring de ikke-citerede kolonnenavne inde i din funktion, og du er færdig!

Bemærk, at du har brug for mindst version 0.4.0 af rlang-pakken for at dette skal fungere. På det tidspunkt, hvor jeg skrev denne artikel, var version 0.4.0 på CRAN, men du var nødt til at kompilere den fra kilden, når den fik denne mulighed under installationen, i det mindste på en Mac.

I koden nedenfor indlæser jeg rlang og finjusterer min bar plot-funktion, så hver gang jeg henviser til et kolonnenavn inden for ggplot, omgiver jeg det med dobbelt krøllede seler - "krøllet krøllet" er, hvordan pakkeopretterne henviser til det.

bibliotek (rlang)

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

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

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

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (størrelse = 24))

}

Nu kan jeg ringe til min funktion med

mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index by Boston Neighborhood")

Ligesom med tidyverse-funktioner behøvede jeg ikke at sætte kolonnenavnene i anførselstegn. Det opretter en graf som den nedenfor

Sharon Machlis,

Jeg kan stadig tilpasse grafen oprettet af min funktion ved hjælp af andre ggplot-kommandoer. I den næste kodeblok gemmer jeg grafen oprettet af min brugerdefinerede funktion til en variabel og foretager derefter nogle flere ændringer. Det geom_text () kode viser medianværdien på hver bjælke, og tema() indstiller grafens overskriftsstørrelse.

mygraph <- mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index by Boston Neighborhood")

mygraph +

geom_text (aes (label = skalaer :: komma (Zhvi, præfiks = "$")),

hjust = 1.0, farve = "hvid", position = position_dodge (.9), størrelse = 4) +

tema (plot.title = element_text (størrelse = 24))

Den nye graf ser sådan ud:

Sharon Machlis,

For flere R-tip, gå til siden "Gør mere med R" på eller "Gør mere med R" -spilelisten på YouTube.