Cambiare i caratteri in ggplot2


97

C'era una volta, ho cambiato il mio ggplot2carattere usando using windowsFonts(Times=windowsFont("TT Times New Roman"))per cambiarlo. Ora non riesco a toglierlo da questo.

Nel tentativo di set family=""in ggplot2 theme()Non riesco a generare un cambiamento di font come compilo il MWE di seguito con diverse famiglie di font.

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 sta restituendo un avviso font family not found in Windows font database, ma c'era un tutorial che stavo seguendo (se riesco a trovarlo di nuovo aggiornerò il collegamento qui) che diceva che era normale e non un problema. Inoltre, in qualche modo questo ha funzionato a un certo punto perché il mio grafico una volta utilizzava un font di tipo arial o helvitica. Penso che questo sia sempre stato un avvertimento presente anche durante i primi tempi di migrazione.

AGGIORNARE

quando eseguo il windowsFonts()mio output è

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier New"

Ma questo è dopo che ho eseguito, font_import()quindi posso solo concludere che i miei caratteri non vengono salvati nel posto giusto. Il codice che ha eseguito la font_import()richiesta carica effettivamente le librerie con:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))

2
È una domanda e una risposta specifiche di Windows? Qualcuno vuole generalizzare su Linux?
— smci

2
Inoltre, è windowsFontsscomparso da grDevices dopo 3.4.1 . Il codice qui deve essere aggiornato.
— smci

1
@smci: guarda questo e questo . Hai solo bisogno di specificare il percorso giusto in Linux
— Tung

Risposte:


129

Ti sei appena perso un passaggio di inizializzazione, credo.

Puoi vedere quali caratteri hai a disposizione con il comando windowsFonts(). Ad esempio il mio assomiglia a questo quando ho iniziato a guardare questo:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Dopo aver installato il pacchetto extraFont ed eseguito in font_importquesto modo (ci sono voluti circa 5 minuti):

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

Ne avevo molti altri disponibili - discutibili troppi, sicuramente troppi per elencarli qui.

Poi ho provato il tuo codice:

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)

cedendo questo:

inserisci qui la descrizione dell'immagine

Aggiornare:

Puoi trovare il nome di un carattere di cui hai bisogno per il familyparametro element_textcon il seguente frammento di codice:

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

E poi:

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)

rende: inserisci qui la descrizione dell'immagine


Grazie per l'aiuto, a metà strada. Ora posso passare da mono||sans(questi non sembrano diversi finora) e serif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my loadFonts` ha avuto successo. Quando chiamo fonts()ho un elenco di quasi 300 caratteri, ma la mia ipotesi è che non siano stati installati nell'ambiente locale rendendoli accessibili al dispositivo Windows. Non sono sicuro che abbia senso, ma ho provato a fornire un aggiornamento alla mia domanda originale con frammenti che potrebbero aiutare. Grazie ancora!
— EngBIRD

Grazie per l'aggiornamento dello snippet dei nomi, sembra molto utile, in che modo il tuo esempio di comic sans Ms ha prodotto l'aspetto giusto se la famiglia è l'unica stringa che la mia installazione riconosce.
— EngBIRD

Fortuna. In quel carattere (e in molti altri), il nome della famiglia è lo stesso del valore della famiglia. Quindi wf[which(wf=="Comic Sans MS")]rende$``Comic Sans MS`` [1] "Comic Sans MS"
— Mike Wise

Grazie, sai se è possibile dirigere o caricare i caratteri da un luogo particolare? Vale a dire anche per l'installazione di caricare i caratteri o specificando i caratteri? Non ottengo i caratteri visibili di Windows aggiuntivi quando
— ripeto la

Hai eseguito font_import e loadfonts () uno dopo l'altro?
— Mike Wise

43

Un'altra opzione è utilizzare un showtextpacchetto che supporta più tipi di caratteri (TrueType, OpenType, Tipo 1, caratteri Web, ecc.) E più dispositivi grafici ed evita di utilizzare software esterni come Ghostscript.

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

Importa alcuni caratteri Google

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

Carica il carattere dal percorso di ricerca corrente in 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: è necessario aprire il dispositivo grafico Windows poiché showtextnon funziona bene con il dispositivo grafico integrato 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) 

Modifica : un'altra soluzione alternativa da utilizzare showtextin RStudio. Esegui il codice seguente all'inizio della sessione R ( origine )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)

Modifica 2 : a partire dalla versione 0.9, showtext può funzionare bene con il dispositivo grafico RStudio (RStudioGD). Basta chiamare showtext_auto()nella sessione RStudio e quindi i grafici verranno visualizzati correttamente.


1
Grazie, non vedo l'ora di provarlo!
— EngBIRD

1
grazie mille volte ... il pacchetto rende super facile a) verificare quali famiglie di caratteri hai a disposizione per ggplot da font_families () - b) cerca i nomi dei file dei caratteri da font_files () - c) aggiungendo il file dei caratteri come famiglia di caratteri da font_add (family, font_file_name). Eccezionale!!!
— Agile Bean

@AgileBean: felice di aver potuto aiutare :)
— Tung

1
importante: dovete prima installare tutti il ​​pacchetto XQuartz da xquartz.org , altrimenti riceverete un errore non descrittivo nel tentativo di caricare la libreria.
— ivo Welch

Questa soluzione non funziona per me. Ottengo ancora il carattere predefinito, sia nella finestra che nella finestra del grafico di Rstudio.
— GreenManXY

11

Una semplice risposta se non vuoi installare nulla di nuovo

Per cambiare tutti i caratteri nella trama plot + theme(text=element_text(family="mono"))Dov'è monoil carattere scelto.

Elenco delle opzioni di carattere predefinite:

  • mono
  • sans
  • serif
  • Corriere
  • Helvetica
  • Volte
  • Avanguardia
  • Bookman
  • Helvetica-Narrow
  • NewCenturySchoolbook
  • Palatino
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R non ha una grande copertura dei caratteri e, come sottolinea Mike Wise , R utilizza nomi diversi per i caratteri comuni.

Questa pagina esamina in dettaglio i caratteri predefiniti.


4

In ritardo per la festa, ma questo potrebbe essere di interesse per le persone che cercano di aggiungere caratteri personalizzati ggplotsall'interno di shinyun'app su shinyapps.io.

Puoi:

  1. Posiziona il carattere personalizzato nella wwwdirectory: ad es. IndieFlower.ttfDa qui
  2. Segui i passaggi da qui

Questo porta alla seguente sezione superiore all'interno del app.Rfile:

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

Un'app di esempio completa può essere trovata qui .


3

Per cambiare il carattere a livello globale per i grafici ggplot2.

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.