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.