Cómo escribir sus propias funciones ggplot2 en R

Los paquetes de Tidyverse como ggplot2 y dplyr tienen una sintaxis de función que suele ser bastante útil: no es necesario poner los nombres de las columnas entre comillas. Por ejemplo: 

dplyr :: filter (mtcars, mpg> 30)

Tenga en cuenta que el nombre de la columna, mpg, no está entre comillas.

Sin embargo, esa característica no ha sido útil si desea escribir sus propias funciones R usando el tidyverse. Esto se debe a que las funciones base R generalmente necesitan nombres de columna entre comillas, mientras que las funciones tidyverse generalmente no.

Pero ese problema tiene una solución simple ahora, gracias a la última versión del paquete rlang. Y eso significa que es muy fácil crear sus propias funciones de ggplot para sus gráficos personalizados favoritos.

Permítanme analizar un ejemplo, utilizando datos de Zillow con valores medios estimados de las viviendas. En el siguiente código, cargo un par de paquetes, configuro el nombre de mi archivo de datos y uso la download.filefunción de base R para descargar un CSV de Zillow. Pasos finales de preparación de datos: importe ese CSV a R y filtre las filas donde Cityestá Boston. (Estoy usando el paquete rio para la importación de datos porque me encanta rio, pero puedes usar algo más como read_csv()o fread()). Si lo estás siguiendo, puedes filtrar por otra ciudad.

biblioteca (dplyr)

biblioteca (ggplot2)

# Nombre de archivo al que quiero descargar datos:

myfilename <- "Zillow_neighborhood_home_values.csv"

# Si go.infoworld.com/ZillowData no funciona, la URL completa es

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

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

bos_values%

filtro (Ciudad == "Boston")

A continuación, crearé un gráfico de barras horizontales con algunas personalizaciones que a menudo me gusta usar. Estoy ordenando las barras de mayor a menor valor, delimitándolas en negro, coloreandolas en azul y cambiando el fondo gris predeterminado de ggplot2.

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

geom_col (color = "negro", relleno = "# 0072B2") +

xlab ("") +

ylab ("") +

ggtitle ("Índice de valor de la vivienda de Zillow por vecindario de Boston") +

theme_classic () +

tema (plot.title = element_text (tamaño = 24)) +

coord_flip ()

¿Qué pasa si quisiera hacer mi propia función para generar rápidamente un gráfico como este con cualquier marco de datos? Más específicamente, ¿una función con argumentos de entrada del nombre del marco de datos, la columna x, la columna y y el título del gráfico? 

A continuación se muestra un intento de crear una función llamada mybarplotcon las personalizaciones que quiero, sin usar el paquete rlang. Sin embargo, no funcionará.

mybarplot <- función (mydf, myxcol, myycol, mytitle) {

ggplot (datos = mydf, aes (x = reordenar (myxcol, myycol), y = myycol)) +

geom_col (color = "negro", relleno = "# 0072B2") +

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (tamaño = 24))

}

Le mostraré lo que sucede si trato de llamar a esa función usando nombres de columna sin comillas. Por ejemplo: 

mybarplot (bos_values, RegionName, Zhvi,

"Índice de valor de la vivienda Zillow por vecindario de Boston")

El resultado es que obtengo un error, como puede ver en el video de arriba. Si  llamo a la función con nombres de columna entre comillas, obtengo un gráfico, pero no el gráfico que quiero.

Sharon Machlis,

Esto se debe al problema de que la base R necesita nombres de columna entre comillas, mientras que ggplot no.

Las versiones anteriores del paquete rlang tenían una solución de varios pasos para esto, como mencioné en un episodio anterior de "Do More With R", "Tidy Eval in R." La versión actual de rlang resuelve el problema con un nuevo operador llamado operador de evaluación ordenada: llaves dobles. Simplemente coloque las llaves alrededor de los nombres de las columnas sin comillas dentro de su función, ¡y listo!

Tenga en cuenta que necesita al menos la versión 0.4.0 del paquete rlang para que esto funcione. En el momento en que escribí este artículo, la versión 0.4.0 estaba en CRAN, pero era necesario compilarlo desde la fuente cuando se le brindaba esa opción durante la instalación, al menos en una Mac.

En el siguiente código, cargo rlang y modifico mi función de gráfico de barras, así que cada vez que me refiero a un nombre de columna dentro de ggplot, lo rodeo con llaves dobles - "curly curly" es como lo llaman los creadores del paquete. 

biblioteca (rlang)

mybarplot <- función (mydf, myxcol, myycol, mytitle) {

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

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

geom_col (color = "negro", relleno = "# 0072B2") +

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

theme_classic () +

tema (plot.title = element_text (tamaño = 24))

}

Ahora puedo llamar a mi función con

mybarplot (bos_values, RegionName, Zhvi,

"Índice de valor de la vivienda Zillow por vecindario de Boston")

Al igual que con las funciones tidyverse, no necesitaba poner los nombres de las columnas entre comillas. Crea un gráfico como el siguiente

Sharon Machlis,

Todavía puedo modificar el gráfico creado por mi función, usando otros comandos ggplot. En el siguiente bloque de código, guardo el gráfico creado por mi función personalizada en una variable y luego hago algunos cambios más. El geom_text()código muestra el valor medio en cada barra y theme()establece el tamaño del título del gráfico.

mygraph <- mybarplot (bos_values, RegionName, Zhvi,

"Índice de valor de la vivienda Zillow por vecindario de Boston")

mygraph +

geom_text (aes (etiqueta = escalas :: coma (Zhvi, prefijo = "$")),

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

tema (plot.title = element_text (tamaño = 24))

El nuevo gráfico se vería así:

Sharon Machlis,

Para obtener más consejos de R, dirígete a la página "Haz más con R" en o a la lista de reproducción "Haz más con R" en YouTube.