Programmering

Hvordan du skriver dine egne ggplot2-funksjoner i R

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.

$config[zx-auto] not found$config[zx-overlay] not found