Zmiana czcionek w ggplot2

91

Pewnego razu zmieniłem ggplot2czcionkę za pomocą, windowsFonts(Times=windowsFont("TT Times New Roman"))aby ją zmienić. Teraz nie mogę tego z tego wyciągnąć.

W próbuje ustawić family=""na ggplot2 theme()nie wydaje się generować zmianę czcionek jak skompilować MWe poniżej z różnych rodzin czcionek.

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 zwraca ostrzeżenie font family not found in Windows font database, ale był samouczek, który śledziłem (jeśli znajdę go ponownie, zaktualizuję link tutaj), który mówi, że to normalne i nie stanowi problemu. W pewnym sensie to zadziałało, ponieważ mój wykres używał kiedyś czcionki typu arial lub helvitica. Myślę, że zawsze było to aktualne ostrzeżenie, nawet w początkowych czasach migracji.

AKTUALIZACJA

kiedy uruchamiam windowsFonts()mój wynik jest

$ serif [1] "TT Times New Roman"

$ sans [1] „TT ​​Arial”

$ mono [1] „TT ​​Courier New”

Ale to jest po uruchomieniu, font_import()więc mogę tylko stwierdzić, że moje czcionki nie są zapisywane we właściwym miejscu. Kod, który uruchomił font_import()żądanie, w rzeczywistości ładuje biblioteki za pomocą:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))
EngBIRD
źródło
2
Czy to jest pytanie i odpowiedź dotyczące systemu Windows? Czy ktoś chce uogólnić na Linuksa?
smci
2
Również windowsFontszniknął z grDevices po 3.4.1 . Kod tutaj wymaga aktualizacji.
smci
1
@smci: zobacz to i to . Musisz tylko określić właściwą ścieżkę w Linuksie
Tung

Odpowiedzi:

124

Myślę, że właśnie przegapiłeś krok inicjalizacji.

Możesz zobaczyć, jakie czcionki masz dostępne za pomocą polecenia windowsFonts(). Na przykład mój wygląda tak, kiedy zacząłem patrzeć na to:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Po zainstalowaniu pakietu extraFont i uruchomieniu w font_importten sposób (zajęło to około 5 minut):

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

Miałem o wiele więcej dostępnych - dyskusyjnych zbyt wiele, na pewno zbyt wiele, aby je tutaj wymienić.

Potem wypróbowałem twój kod:

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)

dając to:

wprowadź opis obrazu tutaj

Aktualizacja:

Możesz znaleźć nazwę czcionki, której potrzebujesz dla familyparametru, element_textza pomocą następującego fragmentu kodu:

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

I wtedy:

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)

plony: wprowadź opis obrazu tutaj

Mike Wise
źródło
Dzięki za pomoc, w połowie drogi. Mogę teraz przełączać się między mono||sans(jak na razie nie wyglądają inaczej) i serif``, but not the actually name like „TT Times New Roman” , but additionally, I not sure that my loadFonts ” powiódł się. Kiedy dzwonię fonts(), mam listę prawie 300 czcionek, ale domyślam się, że nie zostały one zainstalowane w lokalnym środowisku, dzięki czemu są dostępne dla urządzenia z systemem Windows. Nie jestem pewien, czy to ma sens, ale starałem się zaktualizować moje pierwotne pytanie z fragmentami, które mogą pomóc. Dzięki jeszcze raz!
EngBIRD
Dzięki za aktualizację fragmentu nazw, wygląda to bardzo pomocnie, w jaki sposób Twój przykład komiksu bez Ms zapewnił właściwy wygląd, jeśli rodzina jest jedynym ciągiem rozpoznawanym przez moją instalację.
EngBIRD
Szczęście. W tej czcionce (i wielu innych) nazwisko jest takie samo jak wartość rodziny. Więc wf[which(wf=="Comic Sans MS")]daje$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise
Dzięki, czy wiesz, czy można kierować lub ładować czcionki z określonego miejsca? To znaczy, nawet w przypadku instalacji załadowanych czcionek lub określenia czcionek? Nie widzę dodatkowych czcionek widocznych w systemie Windows podczas powtarzania wywołania podsumowującego ...
EngBIRD
Czy uruchomiłeś font_import i loadfonts () zaraz po sobie?
Mike Wise
39

Inną opcją jest użycie showtextpakietu, który obsługuje więcej typów czcionek (TrueType, OpenType, Type 1, czcionki internetowe itp.) I więcej urządzeń graficznych oraz pozwala uniknąć korzystania z oprogramowania zewnętrznego, takiego jak Ghostscript.

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

Zaimportuj niektóre czcionki Google

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

Załaduj czcionkę z bieżącej ścieżki wyszukiwania do 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() 

Fabuła: trzeba otworzyć urządzenie graficzne systemu Windows, ponieważ showtextnie działa dobrze z wbudowanym urządzeniem graficznym 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) 

Edycja : kolejne obejście do użycia showtextw RStudio. Uruchom następujący kod na początku sesji języka R ( źródło )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)
Tung
źródło
1
Dzięki, nie mogę się doczekać możliwości wypróbowania tego!
EngBIRD
1
dziękuję ci tysiąc razy ... pakiet bardzo ułatwia a) sprawdzenie, jakie rodziny czcionek masz dostępne dla ggplot przez font_families () - b) poszukaj nazw plików czcionek przez font_files () - c) dodanie pliku czcionki jako rodzina czcionek przez font_add (rodzina, nazwa_pliku_czcionki). Niesamowite!!!
Agile Bean
@AgileBean: cieszę się, że mogłem pomóc :)
Tung
1
ważne: najpierw musisz zainstalować pakiet XQuartz z xquartz.org , w przeciwnym razie podczas próby załadowania biblioteki pojawi się nieopisowy błąd.
ivo Welch
To rozwiązanie u mnie nie działa. Nadal mam domyślną czcionkę, zarówno w oknie, jak iw oknie wykresu Rstudio.
GreenManXY
9

Prosta odpowiedź, jeśli nie chcesz instalować niczego nowego

Aby zmienić wszystkie czcionki na wykresie, plot + theme(text=element_text(family="mono"))Gdzie monojest wybrana czcionka.

Lista domyślnych opcji czcionek:

  • mononukleoza
  • sans
  • szeryf
  • Kurier
  • Helvetica
  • Czasy
  • AvantGarde
  • Uczony
  • Helvetica-Narrow
  • NewCenturySchoolbook
  • Palatino
  • URWGotyk
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R nie ma dużego zakresu czcionek i, jak wskazuje Mike Wise , R używa różnych nazw dla popularnych czcionek.

Ta strona zawiera szczegółowe omówienie domyślnych czcionek.

DA Wells
źródło
4

Spóźniony na imprezę, ale może to być interesujące dla osób, które chcą dodać niestandardowe czcionki do swojego ggplotswnętrzashiny aplikacji na shinyapps.io.

Możesz:

  1. Miejsce niestandardowe czcionki w wwwkatalogu: np IndieFlower.ttfz tutaj
  2. Postępuj zgodnie z instrukcjami tutaj

Prowadzi to do następującej górnej sekcji w app.Rpliku:

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

Pełną przykładową aplikację można znaleźć tutaj .

symbolrush
źródło
2

Aby globalnie zmienić czcionkę dla wykresów ggplot2.

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
Antex
źródło