Personalizar fuentes en R

Añadir y cargar fuentes personalizadas en R base y ggplot2

Cuando creas gráficos en R puedes especificar la familia de la fuente. Las fuentes integradas en R son sans (Arial), serif (Times New Roman), mono (Courier) y symbol (Standard Symbols L). Sin embargo, esposible personalizar las fuentes en R añadiendo otras con los paquetes extrafont y showtext.

El paquete extrafont

El paquete extrafont permite añadir fuentes True Font Type (.ttf) en R de manera sencilla. Antes de cargar el paquete recomendamos instalar todas las fuente que quieras en tu sistema. Para ello, descárgalas e instálalas haciendo click derechoInstalar para todos los usuarios.

Importando las fuentes del sistema

Una vez hayas instalado las fuentes deseadas lo primero que debes hacer tras instalar el paquete será ejecutar la función font_import, que importará todas las fuentes .ttf de tu sistema.

# install.packages("extrafont")
library(extrafont)

# Importa todos los archivos .ttf de tu sistema
# Tendrás que ejecutar esto una vez, pero tardará unos minutos en acabar
font_import()

Tras ejecutar la función anterior podrás ver una lista de todas las fuentes personalizadas disponibles en R en orden alfabético ejecutando fonts().

# Muestra la lista completa
# fonts()

# Solo las seis primeras fuentes
head(fonts())
[1] "Agency FB"         "Alba Matter"       "Alba Super"       
[4] "Algerian"          "Alte Haas Grotesk" "Arial Black"

Ahora comprueba si todas las fuentes que quieres usar están en la lista. Si no es así, recomendamos el siguiente procedimiento:

  1. Copia los archivos .ttf de las fuentes faltantes y pégalos en una carpeta.
  2. Copia la ruta de la carpeta y ejecuta font_import(path = "La_ruta_de_la_carpeta").

Usando las fuentes personalizadas en R

Después de importar todas las fuentes, tendrás que registrarlas con la función loadfonts. Tendrás que ejecutar el siguiente código una vez por sesión:

# El argumento 'device' también soporta "pdf" y "postscript"
loadfonts(device = "win", quiet = TRUE) 

Ahora podrás especificar las fuentes en el argumento correspondiente de la función gráfica que vayas a emplear, utilizando el nombre que aparezca en la lista fonts() que se corresponda con la fuente que quieras establecer.

# Especifica la familia de fuente con el nombre que se muestre en la lista fonts()
plot(trees$Volume,
     main = "Fuentes personalizadas en R",
     xlab = "",
     ylab = "Volumen",
     pch = 21, col = 4, bg = 4,
     family = "Algerian") # Estamos estableciendo la fuente "Algerian"

Agrega fuentes de Windows con el paquete extrafont

Lo mismo se aplica para gráficos creados con ggplot2:

# install.packages("ggplot2")
library(ggplot2)

ggplot(trees, aes(1:length(Volume), Volume)) +
      ggtitle("Fuentes personalizadas en ggplot2") +
      geom_point(col = 4) + 
      xlab("") +
      theme(text = element_text(family = "Algerian")) # Fuente personalizada

Modificar fuentes en ggplot2

Sin embargo, en algunas funciones, como boxplot o hist, no puedes especificar el argumento family. En este caso existen dos opciones:

Por una parte, puedes crear el gráfico sin textos y añadirlos después con la función title de la siguiente manera:

hist(trees$Height,
     main = "", xlab = "", ylab = "", # Textos vacíos
     col = 4)

# Agrega el título y la etiqueta del eje Y
title("Altura", family = "Algerian", cex.main = 2)
title(ylab = "Frecuencia", family = "Algerian", cex.lab = 1)

Histograma con fuentes personalizadas en R con el paquete extrafont

Por otra parte, puedes modificar los parámetros gráficos estableciendo el argumento family de la función par. Ten en cuenta que con este método se modificarán las fuentes de todos los textos, incluidos los números.

# Guarda los parámetros gráficos actuales
op <- par(no.readonly = TRUE)

# Establece la fuente globalmente
par(family = "Algerian") # Especifica el nombre de la fuente

# Crea el histograma
hist(trees$Height,
     main = "Todas las fuentes",
     ylab = "Frequencia",
     xlab = "",
     col = 4)

# Reestablece los parámetros gráficos
on.exit(par(op))
# dev.off()

El paquete extrafont

Carga la librería extrafont y ejecuta la función loadfonts en tu sesión de R antes de cargar cualquier otro paquete para evitar errores.

El paquete showtext

La librería showtext se creó como una solución más sencilla (evitando el uso de software externo) mediante una forma más fácil de agregar fuentes personalizadas en gráficos de R. Este paquete funciona con diferentes tipos de fuentes como TrueType (.ttf), OpenType (.otf), Type 1, web fonts entre otras, mientras que el anterior solo funciona para fuentes .ttf.

Agregando una fuente de Google

Se pueden agregar Google Fonts con la función font_add_google del paquete. Como ejemplo, si quieres añadir la fuente Pacifico puedes escribir:

# install.packages("showtext")
library(showtext)

# Necesitarás conexión a internet
# Si reinicias R, tendrás que ejecutar este código de nuevo para usar la fuente
font_add_google(name = "Pacifico",   # Nombre de la fuente en el sitio Google Fonts
                family = "pacifico") # Nombre con el que quieres llamar a la fuente

En el argumento name tendrás que especificar el nombre de la fuente que se muestra en el sitio Google Fonts. La cadena de caracteres especificada en el argumento family será el que tengas que establecer cuando especifiques la fuente.

Puedes llamar a la función font_add_google tantas veces como fuentes quieras cargar. Lo mismo se aplica a la función font_add, que revisaremos en la siguiente sección.

Cargando una fuente personalizada en R

Si quieres agregar fuentes personalizadas en R que hayas descargado desde cualquier recurso tendrás que usar la función font_add. Para cargar una fuente personalizada por primera vez tendrás que seguir los siguientes pasos:

  1. Descarga la fuente que quieras.
  2. Ve al archivo (.otf, .ttf, …) e instala la fuente en tu ordenador (click derechoInstalar para todos los usuarios).
  3. Ejecuta font_paths() y ve al directorio que muestre la salida (en Windows debería ser C:\\Windows\\Fonts).
  4. Busca la fuente que has instalado. Haz click derechoPropiedades y copia el texto que aparece en la parte superior de la pestaña ‘General’.
  5. Elige un nombre para especificar en el argumento family y pega el texto que copiaste en el punto anterior en el argumento regular (más la extensión del archivo) de la función font_add.

Las próximas veces tan solo tendrás que usar la función font_add (Paso 5).

A modo ilustrativo vamos a instalar la fuente Demo Muthiara. Descárgala, sigue los pasos anteriores y añádela.

# install.packages("showtext")
library(showtext)

# Comprueba la ruta de las fuentes de tu sistema
font_paths() # "C:\Windows\Fonts"

# Agrega una fuente personalizada. Tendrás que ejecutar esto cada vez que reinices R
font_add(family = "muthiara", # Nombre que quieras usar
         regular = "Muthiara-demo-version.otf") # Texto de la pestaña 'General' más la extensión

La función font_add también tiene los argumentos bold, italic, bolditalic y symbol en caso de que quieras agregar diferentes estilos en las fuentes que estás cargando (en caso de que estén disponibles para la fuente).

Usando las fuentes en R

Una vez hayas cargado todas las fuente que quieras existen tres formas distintas de usarlas en R con el paquete showtext:

Primero, si quieres que la fuente se establezca en todos los dispositivos gráficos tan solo tienes que ejecutar la función showtext_auto y especificar la fuente en el argumento correspondiente de la función que estés utilizando. Como ejemplo, tras cargar las fuentes deseadas puedes especificar la familia de la fuente que cargaste desde Google Fonts de la siguiente manera:

# Recuerda cargar la fuente Pacifico tal y como se mostró en la sección anterior
#-------------------------------------------------------------------------------

# Carga las fuentes para todos los dispositivos gráficos
showtext_auto()

plot(trees$Volume,
     family = "pacifico",    # Fuente. Recuerda que la llamamos "pacifico"
     main = "Volumen árboles",
     ylab = "Volumen", xlab = "",
     pch = 21, col = 4, bg = 4)

El paquete showtext en R

Sin embargo, otras funciones (como boxplot o hist) necesitarán que establezcas los textos individualmente como sigue:

# Recuerda cargar la fuente Pacifico tal y como se mostró en la sección anterior
#-------------------------------------------------------------------------------

# Carga las fuentes para todos los dispositivos gráficos
showtext_auto()

boxplot(trees$Volume,
        main = "", xlab = "", ylab = "", # Textos vacíos
        ylim = c(10, 90),
        col = 4)

# Añade el título, la etiqueta del eje Y y el texto con la fuente personalizada
title("Volumen árboles", family = "pacifico", cex.main = 2)
title(ylab = "Volumen", family = "pacifico", cex.lab = 1)
text(x = 0.8, y = 78, "Atípico", family = "pacifico", cex = 1.2)

Cargar fuentes de Google (Google Fonts) en R

Una alternativa a estas funciones es establecer la familia de fuente con la función par, pero tendrás que registrar las fuentes con las funciones windowsFonts y windowsFont, donde tendrás que indicar la correspondiente cadena de caracteres de la salida de la función fonts del paquete extrafonts. Ve a la sección anterior si la fuente que quieres añadir no aparece en la salida de esa función.

Esto modificará la fuente de todos los textos a la vez. No obstante, este procedimiento solo funcionará con fuentes de Windows, por lo que usaremos la fuente Muthiara en este ejemplo, aunque también puedes descargar una Google Font e instalarla en tu equipo.

# Guardamos los parámetros gráficos actuales
op <- par(no.readonly = TRUE)

# Registramos la fuente. Tendrás que especificar el elemento correspondiente de extrafont::fonts() 
# En nuestro caso: extrafont::fonts()[245] devolverá "Muthiara -Demo Version-"
windowsFonts(muthiara = windowsFont("Muthiara -Demo Version-"))

# Establece la fuente globalmente
par(family = "muthiara") # Especifica el nombre de la variable que estableciste en la función windowsFonts

# Crea el gráfico
boxplot(trees$Volume,
        main = "FUENTES",
        ylab = "Volumen",
        ylim = c(10, 90),
        col = 4)
text(x = 0.8, y = 78, "Atípico", cex = 1.2)

# Reestablece los parámetros gráficos
on.exit(par(op))
# dev.off()

Agregar fuentes personalizadas en R

De manera similar, puedes hacer lo mismo para un gráfico ggplot2:

# Recuerda cargar la fuente Pacifico tal y como se mostró en la sección anterior
#-------------------------------------------------------------------------------

# install.packages("ggplot2")
library(ggplot2)

# Carga las fuentes para todos los dispositivos gráficos
showtext_auto()

# Boxplot
ggplot(data = trees, aes(x = "", y = Volume)) +
       stat_boxplot(geom = "errorbar",      
                    width = 0.2) +
       geom_boxplot(fill = 4,       
                    outlier.colour = 1) +          
       ggtitle("Volumen árboles") + 
       annotate("text", x= 0.8, y = 78, label = "Atípico",
                family = "pacifico") +  # Fuente para la anotación
       ylab("Volumen") +
       xlab("") +
       theme(text = element_text(family = "pacifico")) # Fuente para el resto de textos

Google Fonts en R con el paquete showtext

Segundo, si quieres usar fuentes personalizadas en ciertas ventanas gráficas que abras en tu sesión tendrás que poner tus códigos dentro de las funciones showtext_auto() y showtext_auto(FALSE), que usarán showtext de forma automática para futuras ventanas gráficas y lo desactivarán, respectivamente. Este es el proceso recomendado para utilizar el paquete. En el siguiente bloque de código puedes ver un ejemplo utilizando el paquete calendR.

# Recuerda cargar la fuente Muthiara tal y como se mostró en la sección anterior
#-------------------------------------------------------------------------------

showtext_auto()

# -------- Gráficos --------------
# install.packages(calendR)
library(calendR)

calendR(year = 2022, mbg.col = 4,
        start = "M",
        weeknames = c("L", "M", "X", "J", "V", "S", "D"),
        months.col = "white",
        special.days = "weekend",
        special.col = "lightblue",
        lty = 0,
        title.size = 60,
 	    orientation = "p",
        font.family = "muthiara") # Especifica la fuente que cargamos antes

# -------- Fin de los gráficos ----------

showtext_auto(FALSE)

Ejemplo gráfico de R con fuentes personalizadas

La última opción es usar showtext en una parte específica del código. Para ese propósito puedes usar las funciones showtext_begin y showtext_end.

# Recuerda cargar la fuente Pacifico tal y como se mostró en la sección anterior
#-------------------------------------------------------------------------------

boxplot(trees$Volume,
        main = "",
        xlab = "",
        ylab = "Volumen",
        ylim = c(10, 90),
        col = 4)

# No podrás usar la fuente "pacifico" fuera de estas funciones:
showtext_begin()
title("Volumen árboles", family = "pacifico", cex.main = 2)
showtext_end()

# Lo siguiente imprimirá una advertencia y usará la fuente por defecto:
text(x = 0.8, y = 78, "Atípico", family = "pacifico", cex = 1.2)

Funciones showtext_begin y showtext_end

La compatibilidad con RStudio del paquete empieza en la versión 0.9. Si ejecutas showtext_auto todo debería funcionar según lo esperado.