Come scrivere le proprie funzioni ggplot2 in R

I pacchetti Tidyverse come ggplot2 e dplyr hanno una sintassi della funzione che di solito è molto utile: non è necessario mettere i nomi delle colonne tra virgolette. Per esempio: 

dplyr :: filter (mtcars, mpg> 30)

Notare che il nome della colonna, mpg, non è quotato.

Questa funzionalità non è stata utile, però, se vuoi scrivere le tue funzioni R usando tidyverse. Questo perché le funzioni R di base di solito richiedono nomi di colonna tra virgolette, mentre le funzioni tidyverse generalmente no.

Ma quel problema ha una soluzione semplice ora, grazie all'ultima versione del pacchetto rlang. E questo significa che è molto facile creare le tue funzioni ggplot per i tuoi grafici personalizzati preferiti.

Vorrei fare un esempio, utilizzando i dati di Zillow con valori domestici mediani stimati. Nel codice seguente, carico un paio di pacchetti, imposto il nome del file di dati e utilizzo la download.filefunzione di base R per scaricare un CSV da Zillow. Passaggi finali di preparazione dei dati: importa quel CSV in R e filtra le righe in cui si Citytrova Boston. (Sto usando il pacchetto rio per l'importazione dei dati perché amo rio, ma puoi usare qualcos'altro come read_csv()o fread().) Se stai seguendo, sentiti libero di filtrare per un'altra città.

libreria (dplyr)

libreria (ggplot2)

# Nome del file su cui voglio scaricare i dati:

myfilename <- "Zillow_neroute_home_values.csv"

# Se go.infoworld.com/ZillowData non funziona, l'URL completo lo è

# //files.zillowstatic.com/research/public/Nerowsehood/Neroute_Zhvi_Summary_AllHomes.csv

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

bos_values%

filtro (Città == "Boston")

Successivamente, creerò un grafico a barre orizzontali con alcune personalizzazioni che spesso mi piace usare. Ordino le barre dai valori più alti a quelli più bassi, delineandole in nero, colorandole in blu e cambiando lo sfondo grigio predefinito di ggplot2.

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

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

xlab ("") +

ylab ("") +

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

theme_classic () +

theme (plot.title = element_text (size = 24)) +

coord_flip ()

E se volessi creare la mia funzione per generare rapidamente un grafico come questo con qualsiasi frame di dati? Più specificamente, una funzione con argomenti di input del nome del frame di dati, la colonna x, la colonna y e il titolo del grafico? 

Di seguito è riportato un tentativo di creare una funzione chiamata mybarplotcon le personalizzazioni desiderate, senza utilizzare il pacchetto rlang. Tuttavia, non funzionerà.

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

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

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (size = 24))

}

Ti mostrerò cosa succede se provo a chiamare quella funzione utilizzando nomi di colonna non quotati. Per esempio: 

mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index by Boston Neighborhood")

Il risultato è che ricevo un errore, come puoi vedere nel video sopra. Se  chiamo la funzione con i nomi delle colonne tra virgolette, ottengo un grafico, ma non il grafico che desidero.

Sharon Machlis,

Ciò è dovuto al problema della base R che richiede nomi di colonna tra virgolette mentre ggplot no.

Le versioni precedenti del pacchetto rlang avevano una soluzione in più fasi per questo, come ho spiegato in un episodio precedente di "Do More With R", "Tidy Eval in R." L' attuale versione di rlang risolve il problema con un nuovo operatore chiamato operatore di valutazione ordinata: doppie parentesi graffe. Metti semplicemente le parentesi graffe attorno ai nomi di colonna non quotati all'interno della tua funzione e il gioco è fatto!

Nota che hai bisogno almeno della versione 0.4.0 del pacchetto rlang perché funzioni. Al momento in cui ho scritto questo articolo, la versione 0.4.0 era su CRAN ma era necessario compilarla dai sorgenti quando veniva data questa opzione durante l'installazione, almeno su un Mac.

Nel codice seguente, carico rlang e modifico la mia funzione di grafico a barre in modo che ogni volta che faccio riferimento al nome di una colonna all'interno di ggplot, lo circondo con doppie parentesi graffe - "riccio riccio" è il modo in cui i creatori del pacchetto si riferiscono ad esso. 

biblioteca (rlang)

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

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

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

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (size = 24))

}

Ora posso chiamare la mia funzione con

mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index by Boston Neighborhood")

Proprio come con le funzioni tidyverse, non avevo bisogno di mettere i nomi delle colonne tra virgolette. Crea un grafico come quello qui sotto

Sharon Machlis,

Posso ancora modificare il grafico creato dalla mia funzione, usando altri comandi ggplot. Nel blocco di codice successivo, salvo il grafico creato dalla mia funzione personalizzata in una variabile e poi apporto altre modifiche. Il geom_text()codice visualizza il valore mediano su ciascuna barra e theme()imposta la dimensione del titolo del grafico.

mygraph <- mybarplot (bos_values, RegionName, Zhvi,

"Zillow Home Value Index by Boston Neighborhood")

mygraph +

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

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

tema (plot.title = element_text (size = 24))

Il nuovo grafico sarebbe simile a questo:

Sharon Machlis,

Per altri suggerimenti R, vai alla pagina "Fai di più con R" o alla playlist "Fai di più con R" su YouTube.