web-dev-qa-db-fra.com

Changer les polices dans ggplot2

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

En essayant de définir family="" dans ggplot2theme(), il semble impossible de générer un changement de polices car je compile le fichier MWE ci-dessous avec différentes familles de polices.

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 un tutoriel que je suivais (si je peux le retrouver, je mettrai à jour le lien ici) et qui indique que ceci est normal et ne pose pas de problème. En outre, cela a fonctionné à un moment donné parce que mon graphique utilisait autrefois des polices de type arial ou helvitica. Je pense que cela a toujours été un avertissement, même pendant la migration initiale.

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, ceci est après avoir exécuté font_import(), je ne peux donc que conclure que mes polices ne sont pas enregistrées au bon endroit. Le code qui a exécuté la demande font_import() charge en fait les bibliothèques avec:

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

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 paquet extraFont et lancé font_import comme ceci (cela a pris 5 minutes):

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

J'en avais beaucoup plus disponible - trop discutable, certainement trop pour être énuméré 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:

enter image description here

Mise à jour:

Vous pouvez trouver le nom d'une police dont vous avez besoin pour le paramètre family de element_text avec 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)

rendements: enter image description here

79
Mike Wise

Une autre option consiste à utiliser showtext un package prenant en charge plusieurs types de polices (TrueType, OpenType, Type 1, polices Web, etc.) et plusieurs périphériques graphiques, et évite d'utiliser un logiciel externe tel que Ghostscript.

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

Importer des polices Google

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

Chargez la police à partir 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é: nécessité d'ouvrir le périphérique graphique Windows car showtext ne 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
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) 
18
Tung

En retard pour la fête, mais cela pourrait intéresser les personnes cherchant à ajouter des polices personnalisées à leur ggplots dans une application shiny sur shinyapps.io.

Vous pouvez:

  1. Placez la police personnalisée dans le répertoire www: par exemple. IndieFlower.ttf de ici
  2. Suivez les étapes de ici

Cela conduit à la section supérieure suivante du fichier app.R:

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

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

3
symbolrush