Changer les polices dans ggplot2

91

Il était une fois, j'ai changé ma ggplot2police en utilisant windowsFonts(Times=windowsFont("TT Times New Roman"))pour la changer. Maintenant, je ne peux pas m'en débarrasser.

En essayant de jeu family=""dans ggplot2 theme()je ne peux pas sembler générer un changement dans les polices que je compilez le MWE ci - dessous avec les familles de police différentes.

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 renvoie un avertissement font family not found in Windows font database, mais il y avait un tutoriel que je suivais (si je peux le retrouver, je mettrai à jour le lien ici) qui disait que c'était normal et pas un problème. En outre, cela a fonctionné à un moment donné, car mon graphique utilisait autrefois une police de type arial ou helvitica. Je pense que cela a toujours été un avertissement présent, même pendant les premiers temps de migration.

MISE À JOUR

quand je lance windowsFonts()ma sortie est

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier New"

Mais, c'est après que j'ai couru, font_import()donc je ne peux que conclure que mes polices ne sont pas enregistrées au bon endroit. Le code qui a exécuté la font_import()requête charge en fait les bibliothèques avec:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))
EngBIRD
la source
2
S'agit-il d'une question et d'une réponse spécifiques à Windows? Quelqu'un veut-il généraliser à Linux?
smci
2
Aussi, a windowsFontsdisparu de grDevices après 3.4.1 . Le code ici doit être mis à jour.
smci
1
@smci: voyez ceci et cela . Il vous suffit de spécifier le bon chemin sous Linux
Tung

Réponses:

124

Vous venez de manquer une étape d'initialisation je pense.

Vous pouvez voir les polices disponibles avec la commande windowsFonts(). Par exemple, le mien ressemble à ceci quand j'ai commencé à regarder ceci:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Après avoir installé le package extraFont et exécuté font_importcomme ceci (cela a pris environ 5 minutes):

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

J'en avais beaucoup d'autres disponibles - trop discutables, certainement trop pour les énumérer ici.

Ensuite, j'ai essayé votre code:

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)

donnant ceci:

entrez la description de l'image ici

Mise à jour:

Vous pouvez trouver le nom d'une police dont vous avez besoin pour le familyparamètre de element_textavec l'extrait de code suivant:

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

Puis:

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)

donne: entrez la description de l'image ici

Mike Wise
la source
Merci pour l'aide, à mi-chemin. Je peux maintenant basculer entre mono||sans(ceux-ci ne sont pas différents jusqu'à présent) et serif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my loadFonts` a réussi. Lorsque j'appelle, fonts()j'ai une liste de près de 300 polices, mais je suppose qu'elles n'ont pas été installées dans l'environnement local, ce qui les rend accessibles au périphérique Windows. Je ne sais pas si cela a du sens, mais j'ai essayé de fournir une mise à jour de ma question initiale avec des extraits qui pourraient aider. Merci encore!
EngBIRD
Merci pour cette mise à jour de l'extrait de nom, cela semble très utile, comment votre exemple de bande dessinée sans Ms a-t-il produit la bonne apparence si la famille est la seule chaîne que mon installation reconnaît.
EngBIRD
La chance. Dans cette police (et dans beaucoup d'autres), le nom de famille est le même que la valeur de la famille. Donc wf[which(wf=="Comic Sans MS")]cède$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise
Merci, savez-vous s'il est possible de diriger ou de charger les polices à partir d'un endroit particulier? Ie Même pour l'installation des polices de chargement ou la spécification des polices? Je ne reçois pas les polices supplémentaires visibles de la fenêtre lors de la répétition de l'appel d'affichage du résumé ...
EngBIRD
Avez-vous exécuté font_import et loadfonts () l'un après l'autre?
Mike Wise
39

Une autre option consiste à utiliser un showtextpackage qui prend en charge plus de types de polices (TrueType, OpenType, Type 1, polices Web, etc.) et plus de périphériques graphiques, et évite d'utiliser des logiciels externes tels que Ghostscript.

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

Importez des polices Google

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

Charger la police du chemin de recherche actuel dans 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() 

Tracé: besoin d'ouvrir le périphérique graphique Windows car showtextne fonctionne pas bien avec le périphérique graphique intégré 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) 

Edit : une autre solution de contournement à utiliser showtextdans RStudio. Exécutez le code suivant au début de la session R ( source )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)
Tung
la source
1
Merci, j'ai hâte d'essayer ça!
EngBIRD
1
merci mille fois ... le package rend très facile a) vérifier quelles familles de polices vous avez disponibles pour ggplot par font_families () - b) recherchez les noms de fichiers de polices par font_files () - c) en ajoutant le fichier de police en tant que famille de polices par font_add (family, font_file_name). Impressionnant!!!
Agile Bean
@AgileBean: heureux d'avoir pu aider :)
Tung
1
important: vous devez tout d'abord installer le package XQuartz depuis xquartz.org , sinon vous obtiendrez une erreur non descriptive en essayant de charger la bibliothèque.
ivo Welch
Cette solution ne fonctionne pas pour moi. J'obtiens toujours la police par défaut, à la fois dans la fenêtre et dans la fenêtre de tracé de Rstudio.
GreenManXY
9

Une réponse simple si vous ne voulez rien installer de nouveau

Pour changer toutes les polices de votre tracé plot + theme(text=element_text(family="mono"))monoest la police choisie.

Liste des options de police par défaut:

  • mono
  • sans
  • empattement
  • Courrier
  • Helvetica
  • Fois
  • Avant-garde
  • Bookman
  • Helvetica-Narrow
  • NouveauCenturySchoolbook
  • Palatin
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R n'a pas une bonne couverture de polices et, comme le souligne Mike Wise , R utilise des noms différents pour les polices courantes.

Cette page passe en revue les polices par défaut en détail.

DA Wells
la source
4

En retard à la fête, mais cela pourrait intéresser les personnes qui cherchent à ajouter des polices personnalisées à leur ggplotsintérieur d'une shinyapplication sur shinyapps.io.

Vous pouvez:

  1. Placez la police personnalisée dans le wwwrépertoire: par exemple à IndieFlower.ttfpartir d' ici
  2. Suivez les étapes d' ici

Cela conduit à la section supérieure suivante à l'intérieur du app.Rfichier:

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

Un exemple d'application complet peut être trouvé ici .

symbole
la source
2

Pour changer la police globalement pour les tracés ggplot2.

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