Comment écrire vos propres fonctions ggplot2 en R

Les packages Tidyverse comme ggplot2 et dplyr ont une syntaxe de fonction qui est généralement assez pratique: vous n'avez pas à mettre les noms de colonnes entre guillemets. Par exemple: 

dplyr :: filter (mtcars, mpg> 30)

Notez que le nom de la colonne, mpg, n'est pas entre guillemets.

Cette fonctionnalité n'est cependant pas pratique si vous souhaitez écrire vos propres fonctions R en utilisant le tidyverse. C'est parce que les fonctions de base R ont généralement besoin de noms de colonnes entre guillemets, contrairement aux fonctions tidyverse.

Mais ce problème a maintenant une solution simple, grâce à la dernière version du paquet rlang. Et cela signifie qu'il est très facile de créer vos propres fonctions ggplot pour vos graphiques personnalisés préférés.

Permettez-moi de passer par un exemple, en utilisant des données de Zillow avec des valeurs médianes estimées à la maison. Dans le code ci-dessous, je charge quelques packages, définit le nom de mon fichier de données et utilise la download.filefonction de base R pour télécharger un CSV à partir de Zillow. Étapes finales de préparation des données: importez ce fichier CSV dans R et filtrez les lignes où se Citytrouve Boston. (J'utilise le package rio pour l'importation de données parce que j'aime rio, mais vous pouvez utiliser autre chose comme read_csv()ou fread().) Si vous suivez, n'hésitez pas à filtrer pour une autre ville.

bibliothèque (dplyr)

bibliothèque (ggplot2)

# Nom du fichier sur lequel je souhaite télécharger des données:

myfilename <- "Zillow_ne Neighborhood_home_values.csv"

# Si go.infoworld.com/ZillowData ne fonctionne pas, l'URL complète est

# //files.zillowstatic.com/research/public/Nequarthood/Nequarthood_Zhvi_Summary_AllHomes.csv

download.file ("// go.infoworld.com/ZillowData", mon nom de fichier)

bos_values%

filtre (Ville == "Boston")

Ensuite, je vais créer un graphique à barres horizontales avec des personnalisations que j'aime souvent utiliser. Je classe les barres des valeurs les plus élevées aux valeurs les plus basses, en les décrivant en noir, en les colorant en bleu et en modifiant l'arrière-plan gris par défaut de ggplot2.

ggplot (données = bos_values, aes (x = réorganiser (RegionName, Zhvi), y = Zhvi)) +

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

xlab ("") +

ylab ("") +

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

theme_classic () +

thème (plot.title = element_text (size = 24)) +

coord_flip ()

Et si je voulais créer ma propre fonction pour générer rapidement un graphique comme celui-ci avec n'importe quel bloc de données? Plus précisément, une fonction avec des arguments d'entrée du nom du bloc de données, de la colonne x, de la colonne y et du titre du graphique? 

Vous trouverez ci-dessous une tentative de création d'une fonction appelée mybarplotavec les personnalisations souhaitées, sans utiliser le package rlang. Cependant, cela ne fonctionnera pas.

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

ggplot (données = mydf, aes (x = réorganiser (myxcol, myycol), y = myycol)) +

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mon titre) +

theme_classic () +

thème (plot.title = element_text (size = 24))

}

Je vais vous montrer ce qui se passe si j'essaie d'appeler cette fonction en utilisant des noms de colonnes non entre guillemets. Par exemple: 

mybarplot (bos_values, RegionName, Zhvi,

«Zillow Home Value Index by Boston Neighborhood»)

Le résultat est que j'obtiens une erreur, comme vous pouvez le voir dans la vidéo ci-dessus. Si  j'appelle la fonction avec des noms de colonnes entre guillemets, j'obtiens un graphique - mais pas le graphique que je veux.

Sharon Machlis,

Cela est dû au problème de base R nécessitant des noms de colonnes entre guillemets, contrairement à ggplot.

Les anciennes versions du package rlang avaient une solution en plusieurs étapes pour cela, comme je l'ai expliqué dans un épisode précédent de «Do More With R», «Tidy Eval in R.» La version actuelle de rlang résout le problème avec un nouvel opérateur appelé l'opérateur d'évaluation tidy - doubles accolades. Vous venez de mettre les accolades autour des noms de colonnes sans guillemets dans votre fonction, et vous avez terminé!

Notez que vous avez besoin d'au moins la version 0.4.0 du paquet rlang pour que cela fonctionne. Au moment où j'ai écrit cet article, la version 0.4.0 était sur CRAN mais vous deviez la compiler à partir des sources lorsque cette option était donnée lors de l'installation, au moins sur un Mac.

Dans le code ci-dessous, je charge rlang et peaufine ma fonction de tracé à barres afin que chaque fois que je fais référence à un nom de colonne dans ggplot, je l'entoure de doubles accolades - «bouclés bouclés» est la façon dont les créateurs de packages s'y réfèrent. 

bibliothèque (rlang)

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

ggplot2 :: ggplot (données = mydf, aes (x = réorganiser ({{myxcol}},

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

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

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mon titre) +

theme_classic () +

thème (plot.title = element_text (size = 24))

}

Maintenant je peux appeler ma fonction avec

mybarplot (bos_values, RegionName, Zhvi,

«Zillow Home Value Index by Boston Neighborhood»)

Tout comme pour les fonctions tidyverse, je n'ai pas eu besoin de mettre les noms de colonnes entre guillemets. Il crée un graphique comme celui ci-dessous

Sharon Machlis,

Je peux toujours modifier le graphique créé par ma fonction, en utilisant d'autres commandes ggplot. Dans le bloc de code suivant, j'enregistre le graphique créé par ma fonction personnalisée dans une variable, puis j'apporte d'autres modifications. Le geom_text()code affiche la valeur médiane sur chaque barre et theme()définit la taille du titre du graphique.

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, couleur = "blanc", position = position_dodge (.9), taille = 4) +

thème (plot.title = element_text (size = 24))

Le nouveau graphique ressemblerait à ceci:

Sharon Machlis,

Pour plus de conseils sur R, rendez-vous sur la page «Faites plus avec R» ou sur la liste de lecture «Faites plus avec R» sur YouTube.