Cambio de fuentes en ggplot2

91

Érase una vez, cambié mi ggplot2fuente usando using windowsFonts(Times=windowsFont("TT Times New Roman"))para cambiarla. Ahora no puedo sacarlo de esto.

Al tratar de conjunto family=""en la ggplot2 theme()que parece que no puede generar un cambio en las fuentes como compilo la EPM a continuación con diferentes familias de fuentes.

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
        ggtitle("Fuel Efficiency of 32 Cars") +
        xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
        theme(text=element_text(size=16, 
#       family="Comic Sans MS"))
#       family="CM Roman"))
#       family="TT Times New Roman"))
#       family="Sans"))
        family="Serif"))


print(a)
print("Graph should have refreshed")

R está devolviendo una advertencia font family not found in Windows font database, pero había un tutorial que estaba siguiendo (si puedo encontrarlo nuevamente, actualizaré el enlace aquí) que decía que esto era normal y que no era un problema. Además, de alguna manera esto funcionó en un momento dado porque mi gráfico una vez usó alguna fuente tipo arial o helvitica. Creo que esto siempre ha sido una advertencia presente incluso durante la migración inicial.

ACTUALIZAR

cuando ejecuto windowsFonts()mi salida es

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier New"

Pero, esto es después de ejecutar, font_import()por lo que solo puedo concluir que mis fuentes no se están guardando en el lugar correcto. El código que ejecutó la font_import()solicitud realmente carga las bibliotecas con:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))
EngBIRD
fuente
2
¿Es esta una pregunta y una respuesta específicas de Windows? ¿Alguien quiere generalizar a Linux?
smci
2
Además, windowsFontsdesapareció de grDevices después de 3.4.1 . El código aquí necesita actualización.
smci
1
@smci: mira esto y esto . Solo necesita especificar la ruta correcta en Linux
Tung

Respuestas:

124

Creo que acaba de perder un paso de inicialización.

Puede ver qué fuentes tiene disponibles con el comando windowsFonts(). Por ejemplo, el mío se ve así cuando comencé a mirar esto:

> windowsFonts()
$serif
[1] "TT Times New Roman"

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Después de instalar el paquete extraFont y ejecutarlo font_importasí (tomó como 5 minutos):

library(extrafont)
font_import()
loadfonts(device = "win")

Tenía muchos más disponibles, demasiados discutibles, ciertamente demasiados para enumerarlos aquí.

Luego probé tu código:

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text=element_text(size=16,  family="Comic Sans MS"))
print(a)

produciendo esto:

ingrese la descripción de la imagen aquí

Actualizar:

Puede encontrar el nombre de una fuente que necesita para el familyparámetro element_textcon el siguiente fragmento de código:

> names(wf[wf=="TT Times New Roman"])
[1] "serif"

Y entonces:

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text=element_text(size=16,  family="serif"))
print(a)

rinde: ingrese la descripción de la imagen aquí

Mike Wise
fuente
Gracias por la ayuda, a mitad de camino. Ahora puedo alternar entre mono||sans(estos no se ven diferentes hasta ahora) y serif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my loadFonts` tuvo éxito. Cuando llamo fonts(), tengo una lista de casi 300 fuentes, pero supongo que no se instalaron en el entorno local, lo que las hace accesibles para el dispositivo Windows. No estoy seguro de si eso tiene algún sentido, pero traté de proporcionar una actualización a mi pregunta original con fragmentos que podrían ayudar. ¡Gracias de nuevo!
EngBIRD
Gracias por la actualización del fragmento de nombres, parece muy útil, ¿cómo su ejemplo de cómic sin Ms produjo la apariencia correcta si la familia es la única cadena que reconoce mi instalación?
EngBIRD
Suerte. En esa fuente (y en muchas otras), el apellido es el mismo que el valor de la familia. Entonces wf[which(wf=="Comic Sans MS")]cede$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise
Gracias, ¿sabes si es posible dirigir o cargar las fuentes desde un lugar en particular? Es decir, ¿incluso para la instalación de fuentes de carga o especificar las fuentes? No obtengo las fuentes adicionales visibles de Windows cuando
repito la
¿Ejecutó font_import y loadfonts () uno después del otro?
Mike Wise
39

Otra opción es utilizar un showtextpaquete que admita más tipos de fuentes (TrueType, OpenType, Type 1, fuentes web, etc.) y más dispositivos gráficos, y evita el uso de software externo como Ghostscript.

# install.packages('showtext', dependencies = TRUE)
library(showtext)

Importar algunas fuentes de Google

# https://fonts.google.com/featured/Superfamilies
font_add_google("Montserrat", "Montserrat")
font_add_google("Roboto", "Roboto")

Cargue la fuente de la ruta de búsqueda actual en showtext

# Check the current search path for fonts
font_paths()    
#> [1] "C:\\Windows\\Fonts"

# List available font files in the search path
font_files()    
#>   [1] "AcadEref.ttf"                                
#>   [2] "AGENCYB.TTF"                           
#> [428] "pala.ttf"                                    
#> [429] "palab.ttf"                                   
#> [430] "palabi.ttf"                                  
#> [431] "palai.ttf"

# syntax: font_add(family = "<family_name>", regular = "/path/to/font/file")
font_add("Palatino", "pala.ttf")

font_families()
#> [1] "sans"         "serif"        "mono"         "wqy-microhei"
#> [5] "Montserrat"   "Roboto"       "Palatino"

## automatically use showtext for new devices
showtext_auto() 

Trama: es necesario abrir el dispositivo gráfico de Windows, ya showtextque no funciona bien con el dispositivo gráfico incorporado RStudio

# https://github.com/yixuan/showtext/issues/7
# https://journal.r-project.org/archive/2015-1/qiu.pdf
# `x11()` on Linux, or `quartz()` on Mac OS
windows()

myFont1 <- "Montserrat"
myFont2 <- "Roboto"
myFont3 <- "Palatino"

library(ggplot2)

a <- ggplot(mtcars, aes(x = wt, y = mpg)) + 
  geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text = element_text(size = 16, family = myFont1)) +
  annotate("text", 4, 30, label = 'Palatino Linotype',
           family = myFont3, size = 10) +
  annotate("text", 1, 11, label = 'Roboto', hjust = 0,
           family = myFont2, size = 10) 

## On-screen device
print(a) 

## Save to PNG 
ggsave("plot_showtext.png", plot = a, 
       type = 'cairo',
       width = 6, height = 6, dpi = 150)  

## Save to PDF
ggsave("plot_showtext.pdf", plot = a, 
       device = cairo_pdf,
       width = 6, height = 6, dpi = 150)  

## turn showtext off if no longer needed
showtext_auto(FALSE) 

Editar : otra solución alternativa para usar showtexten RStudio. Ejecute el siguiente código al comienzo de la sesión de R ( fuente )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)
Tung
fuente
1
Gracias, espero probar esto.
EngBIRD
1
gracias mil veces ... el paquete hace que sea muy fácil a) verificar qué familias de fuentes tiene disponibles para ggplot por font_families () - b) buscar los nombres de archivo de fuentes por font_files () - c) agregar el archivo de fuente como una familia de fuentes por font_add (family, font_file_name). ¡¡¡Increíble!!!
Agile Bean
@AgileBean: me alegro de poder ayudar :)
Tung
1
importante: todos deben instalar el paquete XQuartz de xquartz.org primero, o obtendrá un error no descriptivo al intentar cargar la biblioteca.
ivo Welch
Esta solución no me funciona. Todavía obtengo la fuente predeterminada, tanto en la ventana como en la ventana de trazado de Rstudio.
GreenManXY
9

Una respuesta simple si no desea instalar nada nuevo

Para cambiar todas las fuentes en su gráfico plot + theme(text=element_text(family="mono"))¿Dónde monoestá la fuente elegida?

Lista de opciones de fuente predeterminadas:

  • mononucleosis infecciosa
  • sans
  • serif
  • mensajero
  • Helvética
  • Veces
  • Vanguardia
  • Bookman
  • Helvética-Estrecha
  • NewCenturySchoolbook
  • Palatino
  • URWGótico
  • URWBookman
  • NimbusMon
  • URWHelvética
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R no tiene una gran cobertura de fuentes y, como señala Mike Wise , R usa diferentes nombres para fuentes comunes.

Esta página repasa las fuentes predeterminadas en detalle.

DA Wells
fuente
4

Tarde a la fiesta, pero esto podría ser de interés para las personas que desean añadir fuentes personalizadas a su ggplotsinterior de una shinyaplicación en shinyapps.io.

Usted puede:

  1. Coloque una fuente personalizada en el wwwdirectorio: por ejemplo, IndieFlower.ttfdesde aquí
  2. Siga los pasos desde aquí

Esto conduce a la siguiente sección superior dentro del app.Rarchivo:

dir.create('~/.fonts')
file.copy("www/IndieFlower.ttf", "~/.fonts")
system('fc-cache -f ~/.fonts')

Puede encontrar una aplicación de ejemplo completa aquí .

simbolos
fuente
2

Para cambiar la fuente globalmente para ggplot2 plots.

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
Antex
fuente