Ändern von Schriftarten in ggplot2

92

Es war einmal eine Zeit, in der ich meine ggplot2Schriftart geändert habe windowsFonts(Times=windowsFont("TT Times New Roman")). Jetzt kann ich es nicht mehr loswerden.

Bei dem Versuch , zu Satz family=""in ggplot2 theme()scheine ich eine Änderung der Schriftart kann nicht zu erzeugen , wie ich die MWE unten mit verschiedenen Schriftfamilien zusammenstellen .

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 gibt eine Warnung zurück font family not found in Windows font database, aber es gab ein Tutorial, dem ich folgte (wenn ich es wieder finde, werde ich den Link hier aktualisieren), das besagte, dass dies normal und kein Problem war. Irgendwie funktionierte dies auch an einem Punkt, weil in meinem Diagramm einmal eine Schriftart vom Typ Arial oder Helvitica verwendet wurde. Ich denke, dies war schon während der ersten Migration eine aktuelle Warnung.

AKTUALISIEREN

wenn ich windowsFonts()meine Ausgabe laufen lasse

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier New"

Dies ist jedoch nach dem Ausführen der Fall, font_import()sodass ich nur den Schluss ziehen kann, dass meine Schriftarten nicht am richtigen Ort gespeichert werden. Der Code, der die font_import()Anforderung ausgeführt hat, lädt die Bibliotheken tatsächlich mit:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))
EngBIRD
quelle
2
Ist dies eine Windows-spezifische Frage und Antwort? Möchte jemand auf Linux verallgemeinern?
smci
2
Auch windowsFontsverschwand von grDevices nach 3.4.1 . Der Code hier muss aktualisiert werden.
smci
1
@smci: siehe dies und das . Sie müssen nur den richtigen Pfad in Linux angeben
Tung

Antworten:

124

Sie haben gerade einen Initialisierungsschritt verpasst, denke ich.

Mit dem Befehl können Sie sehen, welche Schriftarten Ihnen zur Verfügung stehen windowsFonts(). Zum Beispiel sieht meine so aus, als ich anfing, mir das anzuschauen:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Nach dem Installieren des Pakets extraFont und dem Ausführen font_importwie folgt (es dauerte ungefähr 5 Minuten):

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

Ich hatte viel mehr zur Verfügung - wohl zu viele, sicherlich zu viele, um sie hier aufzulisten.

Dann habe ich deinen Code ausprobiert:

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)

ergibt dies:

Geben Sie hier die Bildbeschreibung ein

Aktualisieren:

Den Namen einer Schriftart, die Sie für den familyParameter von benötigen, finden Sie element_textmit dem folgenden Codeausschnitt:

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

Und dann:

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)

Ausbeuten: Geben Sie hier die Bildbeschreibung ein

Mike Wise
quelle
Danke für die Hilfe auf halbem Weg. Ich kann jetzt zwischen mono||sans(diese sehen bisher nicht anders aus) und serif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my umschalten. LoadFonts war erfolgreich. Wenn ich anrufe, habe fonts()ich eine Liste mit fast 300 Schriftarten, aber ich vermute, sie wurden nicht in der lokalen Umgebung installiert, sodass sie für das Windows-Gerät zugänglich sind. Ich bin mir nicht sicher, ob das Sinn macht, aber ich habe versucht, meine ursprüngliche Frage mit Snippets zu aktualisieren, die helfen könnten. Danke noch einmal!
EngBIRD
Vielen Dank für das Namens-Snippet-Update. Es sieht sehr hilfreich aus, wie Ihr Comic ohne Ms-Beispiel das richtige Erscheinungsbild erzeugt hat, wenn die Familie die einzige Zeichenfolge ist, die meine Installation erkennt.
EngBIRD
Glück. In dieser Schriftart (und in vielen anderen) entspricht der Familienname dem Familienwert. Also wf[which(wf=="Comic Sans MS")]ergibt$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise
Vielen Dank, wissen Sie, ob es möglich ist, die Schriftarten von einem bestimmten Ort aus zu steuern oder zu laden? Dh auch für die Installation von Ladeschriftarten oder die Angabe der Schriftarten? Ich bekomme die zusätzlichen Windows-Schriftarten nicht sichtbar, wenn ich den Aufruf der Zusammenfassungsanzeige wiederhole ...
EngBIRD
Haben Sie font_import und loadfonts () direkt nacheinander ausgeführt?
Mike Wise
39

Eine andere Option ist die Verwendung eines showtextPakets, das mehr Schriftarten (TrueType, OpenType, Typ 1, Web-Schriftarten usw.) und mehr Grafikgeräte unterstützt und die Verwendung externer Software wie Ghostscript vermeidet.

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

Importieren Sie einige Google Fonts

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

Laden Sie die Schriftart aus dem aktuellen Suchpfad 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() 

Plot: Windows-Grafikgerät muss geöffnet werden, da showtextes mit dem in RStudio integrierten Grafikgerät nicht gut funktioniert

# 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) 

Bearbeiten : Eine weitere Problemumgehung für showtextRStudio. Führen Sie den folgenden Code zu Beginn der R-Sitzung aus ( Quelle )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)
Tung
quelle
1
Danke, ich freue mich darauf, das auszuprobieren!
EngBIRD
1
tausendmal danke ... das Paket macht es super einfach, a) zu überprüfen, welche Schriftfamilien für ggplot von font_families () verfügbar sind - b) nach den Namen der Schriftdateien zu suchen, indem font_files () - c) die Schriftdatei hinzugefügt wird als Schriftfamilie von font_add (family, font_file_name). Genial!!!
Agile Bean
@ AgileBean: froh, dass ich helfen konnte :)
Tung
1
wichtig: Sie müssen zuerst alle das XQuartz-Paket von xquartz.org installieren, sonst wird beim Laden der Bibliothek ein unbeschreiblicher Fehler angezeigt .
ivo Welch
Diese Lösung funktioniert bei mir nicht. Ich erhalte immer noch die Standardschriftart, sowohl im Fenster als auch im Plotfenster des Rstudios.
GreenManXY
10

Eine einfache Antwort, wenn Sie nichts Neues installieren möchten

So ändern Sie alle Schriftarten in Ihrem Plot plot + theme(text=element_text(family="mono"))Wo monoist Ihre gewählte Schriftart?

Liste der Standardschriftartenoptionen:

  • Mono
  • ohne
  • Serife
  • Kurier
  • Helvetica
  • Mal
  • Avantgarde
  • Bookman
  • Helvetica-Narrow
  • NewCenturySchoolbook
  • Palatino
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R hat keine gute Schriftabdeckung und, wie Mike Wise betont, verwendet R unterschiedliche Namen für gängige Schriftarten.

Auf dieser Seite werden die Standardschriftarten ausführlich beschrieben.

DA Wells
quelle
4

Spät zur Party, aber dies könnte für Leute von Interesse sein, die benutzerdefinierte Schriftarten in ggplotseiner shinyApp auf shinyapps.io hinzufügen möchten.

Sie können:

  1. Legen Sie eine benutzerdefinierte Schriftart im wwwVerzeichnis ab: z. B. IndieFlower.ttfvon hier aus
  2. Folgen Sie den Schritten von hier

Dies führt zu folgendem oberen Abschnitt in der app.RDatei:

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

Eine vollständige Beispiel-App finden Sie hier .

Symbolrush
quelle
2

So ändern Sie die Schriftart global für ggplot2-Diagramme

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