Jak napisać własne funkcje ggplot2 w R

Pakiety Tidyverse, takie jak ggplot2 i dplyr, mają składnię funkcji, która jest zwykle bardzo przydatna: nie musisz umieszczać nazw kolumn w cudzysłowach. Na przykład: 

dplyr :: filter (mtcars, mpg> 30)

Zwróć uwagę, że nazwa kolumny, mpg, nie jest cytowana.

Ta funkcja nie była jednak przydatna, jeśli chcesz pisać własne funkcje języka R przy użyciu tidyverse. Dzieje się tak, ponieważ podstawowe funkcje języka R zwykle wymagają nazw kolumn w cudzysłowach, podczas gdy funkcje tidyverse zazwyczaj nie wymagają.

Ale ten problem ma teraz proste rozwiązanie, dzięki najnowszej wersji pakietu rlang. A to oznacza, że ​​bardzo łatwo jest tworzyć własne funkcje ggplot dla ulubionych dostosowanych wykresów.

Pozwólcie, że przejdę przez przykład, używając danych z Zillow z szacunkowymi medianami wartości domowych. W poniższym kodzie ładuję kilka pakietów, ustawiam nazwę pliku danych i używam funkcji podstawowego R, download.fileaby pobrać plik CSV z Zillow. Końcowe kroki przygotowania danych: zaimportuj ten plik CSV do języka R i filtruj według wierszy, w których Cityjest Boston. (Używam pakietu rio do importu danych, ponieważ uwielbiam rio, ale możesz użyć czegoś innego, np . read_csv()Lub fread()). Jeśli śledzisz tę trasę, możesz przefiltrować inne miasto.

biblioteka (dplyr)

biblioteka (ggplot2)

# Nazwa pliku, do którego chcę pobrać dane:

nazwa_pliku <- „Zillow_neighborhood_home_values.csv”

# Jeśli go.infoworld.com/ZillowData nie działa, pełny adres URL to

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

download.file ("// go.infoworld.com/ZillowData", nazwa mojego pliku)

bos_values%

filtr (miasto == "Boston")

Następnie utworzę poziomy wykres słupkowy z kilkoma dostosowaniami, których często lubię używać. Porządkuję słupki od najwyższych do najniższych, zaznaczam je na czarno, koloruję na niebiesko i zmieniam domyślne szare tło ggplot2.

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

geom_col (kolor = "czarny", wypełnienie = "# 0072B2") +

xlab („”) +

ylab („”) +

ggtitle ("Indeks wartości domu Zillow według Boston Neighborhood") +

theme_classic () +

motyw (plot.title = element_text (rozmiar = 24)) +

koordyn_flip ()

A co jeśli chciałbym stworzyć własną funkcję, która szybko generuje taki wykres z dowolną ramką danych? Mówiąc dokładniej, funkcja z argumentami wejściowymi w postaci nazwy ramki danych, kolumny x, kolumny y i tytułu wykresu? 

Poniżej znajduje się jedna próba utworzenia funkcji o nazwie mybarplotz dostosowaniami, które chcę, bez korzystania z pakietu rlang. Jednak to nie zadziała.

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

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

geom_col (kolor = "czarny", wypełnienie = "# 0072B2") +

xlab („”) +

ylab („”) +

koordyn_flip () +

ggtitle (mytitle) +

theme_classic () +

motyw (plot.title = element_text (rozmiar = 24))

}

Pokażę ci, co się stanie, jeśli spróbuję wywołać tę funkcję przy użyciu niecytowanych nazw kolumn. Na przykład: 

mybarplot (bos_values, RegionName, Zhvi,

„Zillow Home Value Index by Boston Neighborhood”)

W rezultacie pojawia się błąd, jak widać na powyższym filmie. Jeśli  wywołam funkcję z nazwami kolumn w cudzysłowach, otrzymam wykres - ale nie taki, jaki chcę.

Sharon Machlis,

Wynika to z problemu podstawowego R wymagającego nazw kolumn w cudzysłowach, podczas gdy ggplot tego nie robi.

Starsze wersje pakietu rlang miały na to wielostopniowe rozwiązanie, o czym pisałem we wcześniejszym odcinku „Do More With R”, „Tidy Eval in R.”. Aktualna wersja rlang rozwiązuje problem z nowym operatorem nazywany schludny operator ocena - podwójne nawiasy klamrowe. Po prostu umieść nawiasy klamrowe wokół niecytowanych nazw kolumn wewnątrz swojej funkcji i gotowe!

Zauważ, że potrzebujesz co najmniej wersji 0.4.0 pakietu rlang, aby to zadziałało. W czasie, gdy pisałem ten artykuł, wersja 0.4.0 była na CRAN, ale trzeba było skompilować ją ze źródła, gdy dano tę opcję podczas instalacji, przynajmniej na Macu.

W poniższym kodzie ładuję rlang i dostosowuję funkcję wykresu słupkowego, więc za każdym razem, gdy odwołuję się do nazwy kolumny w ggplot, otaczam ją podwójnymi nawiasami klamrowymi - „curly curly” tak nazywają twórcy pakietu. 

biblioteka (rlang)

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

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

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

geom_col (kolor = "czarny", wypełnienie = "# 0072B2") +

xlab („”) +

ylab („”) +

koordyn_flip () +

ggtitle (mytitle) +

theme_classic () +

motyw (plot.title = element_text (rozmiar = 24))

}

Teraz mogę wywołać moją funkcję za pomocą

mybarplot (bos_values, RegionName, Zhvi,

„Zillow Home Value Index by Boston Neighborhood”)

Podobnie jak w przypadku funkcji tidyverse, nie musiałem umieszczać nazw kolumn w cudzysłowie. Tworzy wykres podobny do poniższego

Sharon Machlis,

Nadal mogę modyfikować wykres utworzony przez moją funkcję, używając innych poleceń ggplot. W następnym bloku kodu zapisuję wykres utworzony przez moją funkcję niestandardową w zmiennej, a następnie wprowadzam więcej zmian. Na geom_text()kod wyświetla mediany na każdym pasku, i theme()ustawia rozmiar wykres nagłówek.

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, kolor = "biały", pozycja = pozycja_dodge (.9), rozmiar = 4) +

motyw (plot.title = element_text (rozmiar = 24))

Nowy wykres wyglądałby tak:

Sharon Machlis,

Więcej wskazówek dotyczących języka R można znaleźć na stronie „Zrób więcej z R” na stronie lub na liście odtwarzania „Zrób więcej z R” w YouTube.