Programování

Jak psát vlastní funkce ggplot2 v R.

Balíčky Tidyverse jako ggplot2 a dplyr mají syntaxi funkcí, která je obvykle velmi užitečná: Nemusíte dávat názvy sloupců do uvozovek. Například:

dplyr :: filter (mtcars, mpg> 30)

Poznámka: název sloupce, mpg, je bez uvozovek.

Tato funkce však nebyla užitečná, pokud chcete psát své vlastní funkce R pomocí tidyverse. Je to proto, že základní funkce R obvykle potřebují uvozené názvy sloupců, zatímco funkce tidyverse obecně ne.

Ale tento problém má nyní jednoduché řešení, a to díky nejnovější verzi balíčku rlang. A že znamená, že je velmi snadné vytvořit si vlastní funkce ggplot pro své oblíbené přizpůsobené grafy.

Dovolte mi projít příkladem s využitím údajů od Zillow s odhadovanými středními domácími hodnotami. V níže uvedeném kódu načtu několik balíčků, nastavím název svého datového souboru a použiji základní R. stáhnout soubor funkce ke stažení CSV ze Zillow. Konečné kroky přípravy dat: Importujte tento soubor CSV do R a vyfiltrujte řádky, kde Město je Boston. (K importu dat používám balíček rio, protože mám rád rio, ale můžete použít něco podobného read_csv () nebo fread ().) Pokud to sledujete, můžete filtrovat na jiné město.

knihovna (dplyr)

knihovna (ggplot2)

# Název souboru, do kterého chci stáhnout data:

myfilename <- "Zillow_ne Neighborhood_home_values.csv"

# Pokud go.infoworld.com/ZillowData nefunguje, je úplná adresa URL

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

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

bos_values%

filtr (město == "Boston")

Dále vytvořím vodorovný sloupcový graf s některými přizpůsobeními, která často používám. Řadím pruhy od nejvyšší po nejnižší hodnoty, načrtávám je černě, obarvuji je modře a měníme výchozí šedé pozadí ggplot2.

ggplot (data = bos_values, aes (x = změnit pořadí (RegionName, Zhvi), y = Zhvi)) +

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

xlab ("") +

ylab ("") +

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

theme_classic () +

téma (plot.title = element_text (velikost = 24)) +

coord_flip ()

Co když bych chtěl vytvořit vlastní funkci pro rychlé generování takového grafu s jakýmkoli datovým rámcem? Přesněji řečeno, funkce se vstupními argumenty názvu datového rámce, sloupce x, sloupce y a názvu grafu?

Níže je uveden jeden pokus o vytvoření funkce s názvem mybarplot s přizpůsobením, které chci, bez použití balíčku rlang. Nebude to však fungovat.

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

ggplot (data = mydf, aes (x = změna pořadí (myxcol, myycol), y = myycol)) +

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

téma (plot.title = element_text (velikost = 24))

}

Ukážu vám, co se stane, když se pokusím tuto funkci zavolat pomocí nekotovaných názvů sloupců. Například:

mybarplot (bos_values, RegionName, Zhvi,

„Zillow Home Value Index by Boston Neighborhood“)

Výsledkem je, že se zobrazí chyba, jak vidíte ve videu výše. Kdybych zavolat funkci s citovanými názvy sloupců, dostanu graf - ale ne graf, který chci.

Sharon Machlis,

To je způsobeno tím, že základna R potřebuje citované názvy sloupců, zatímco ggplot nikoli.

Starší verze balíčku rlang měly vícestupňové řešení, protože jsem to popsal v dřívější epizodě „Do More With R“, „Tidy Eval in R.“ The proud verze rlang řeší problém s novým operátorem zvaným uklizený operátor vyhodnocení - dvojité složené závorky. Prostě vložíte složené závorky kolem nekotovaných názvů sloupců do své funkce a máte hotovo!

Aby to fungovalo, potřebujete alespoň verzi 0.4.0 balíčku rlang. V době, kdy jsem psal tento článek, byla verze 0.4.0 na CRANu, ale bylo nutné ji zkompilovat ze zdroje, když byla tato možnost poskytnuta během instalace, alespoň na Macu.

V níže uvedeném kódu načtu rlang a vyladím svou funkci bar plot, takže pokaždé, když odkazuji na název sloupce v ggplot, obklopím ho dvojitými složenými závorkami - „curly curly“ je způsob, jakým na to tvůrci balíčků odkazují.

knihovna (rlang)

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

ggplot2 :: ggplot (data = mydf, aes (x = změnit pořadí ({{myxcol}}),

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

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

téma (plot.title = element_text (velikost = 24))

}

Nyní můžu volat svou funkci s

mybarplot (bos_values, RegionName, Zhvi,

„Zillow Home Value Index by Boston Neighborhood“)

Stejně jako u funkcí tidyverse jsem nepotřeboval dávat názvy sloupců do uvozovek. Vytvoří graf, jako je ten níže

Sharon Machlis,

Stále mohu vylepšit graf vytvořený mou funkcí pomocí dalších příkazů ggplot. V dalším bloku kódu uložím graf vytvořený vlastní funkcí do proměnné a poté provedu další změny. The geom_text () kód zobrazí střední hodnotu na každém sloupci a téma() nastavuje velikost nadpisu grafu.

mygraph <- mybarplot (bos_values, RegionName, Zhvi,

„Zillow Home Value Index by Boston Neighborhood“)

mygraph +

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

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

téma (plot.title = element_text (velikost = 24))

Nový graf by vypadal takto:

Sharon Machlis,

Další tipy R najdete na stránce „Do More With R“ na nebo v playlistu „Do More With R“ na YouTube.