Mengubah font di ggplot2

92

Sekali waktu, saya mengubah ggplot2font saya menggunakan use windowsFonts(Times=windowsFont("TT Times New Roman"))untuk mengubahnya. Sekarang saya tidak bisa melepaskannya dari ini.

Dalam mencoba untuk set family=""di ggplot2 theme()Saya tidak bisa menghasilkan perubahan font seperti yang saya mengkompilasi MWE di bawah ini dengan keluarga font yang berbeda.

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 mengembalikan peringatan font family not found in Windows font database, tetapi ada tutorial yang saya ikuti (jika saya dapat menemukannya lagi, saya akan memperbarui tautannya di sini) yang mengatakan ini normal dan bukan masalah. Juga, entah bagaimana ini berhasil pada satu titik karena grafik saya pernah menggunakan beberapa jenis font arial atau helvitica. Saya pikir ini selalu menjadi peringatan bahkan selama migrasi kali awal.

MEMPERBARUI

ketika saya menjalankan windowsFonts()output saya adalah

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier New"

Tapi, ini setelah saya menjalankan font_import()jadi saya hanya bisa menyimpulkan bahwa font saya tidak disimpan di tempat yang benar. Kode yang menjalankan font_import()permintaan sebenarnya memuat pustaka dengan:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))
EngBIRD
sumber
2
Apakah ini pertanyaan dan jawaban khusus Windows? Apakah ada yang ingin menggeneralisasi ke Linux?
smci
2
Juga, windowsFontsmenghilang dari grDevices setelah 3.4.1 . Kode di sini perlu diperbarui.
smci
1
@smci: lihat ini dan ini . Anda hanya perlu menentukan jalur yang benar di Linux
Tung

Jawaban:

124

Anda baru saja melewatkan langkah inisialisasi.

Anda dapat melihat font apa yang Anda miliki dengan perintah windowsFonts(). Misalnya milik saya terlihat seperti ini ketika saya mulai melihat ini:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Setelah menginstal paket extraFont dan menjalankan font_importseperti ini (butuh waktu 5 menit):

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

Saya memiliki lebih banyak yang tersedia - bisa diperdebatkan terlalu banyak, pasti terlalu banyak untuk dicantumkan di sini.

Lalu saya mencoba kode Anda:

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)

menghasilkan ini:

masukkan deskripsi gambar di sini

Memperbarui:

Anda dapat menemukan nama font yang Anda butuhkan untuk familyparameter element_textdengan cuplikan kode berikut:

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

Lalu:

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)

hasil: masukkan deskripsi gambar di sini

Mike Wise
sumber
Terima kasih atas bantuannya, setengah jalan. Sekarang saya dapat beralih antara mono||sans(sejauh ini tidak terlihat berbeda) dan serif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my loadFonts` berhasil. Ketika saya menelepon, fonts()saya memiliki daftar hampir 300 font, tetapi dugaan saya adalah mereka tidak diinstal ke lingkungan lokal sehingga dapat diakses oleh perangkat windows. Saya tidak yakin apakah itu masuk akal, tetapi saya mencoba memberikan pembaruan untuk pertanyaan asli saya dengan cuplikan yang mungkin membantu. Terima kasih lagi!
EngBIRD
Terima kasih atas pembaruan potongan nama itu, tampaknya sangat membantu, bagaimana komik Anda tanpa contoh Ms menghasilkan tampilan yang tepat jika keluarga adalah satu-satunya string yang dikenali oleh instalasi saya.
EngBIRD
Keberuntungan. Dalam font itu (dan di banyak font lainnya), nama keluarga sama dengan nilai keluarga. Jadi wf[which(wf=="Comic Sans MS")]hasil$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise
Terima kasih, apakah Anda tahu apakah mungkin untuk mengarahkan atau memuat font dari tempat tertentu? Ie Bahkan untuk menginstal font beban atau menentukan font? Saya tidak mendapatkan jendela tambahan font yang terlihat saat mengulangi panggilan tampilan ringkasan ...
EngBIRD
Apakah Anda menjalankan font_import dan loadfonts () tepat setelah satu sama lain?
Mike Wise
39

Pilihan lainnya adalah menggunakan showtextpaket yang mendukung lebih banyak jenis font (TrueType, OpenType, Type 1, font web, dll.) Dan lebih banyak perangkat grafis, dan menghindari penggunaan perangkat lunak eksternal seperti Ghostscript.

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

Impor beberapa Font Google

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

Muat font dari jalur pencarian saat ini ke 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: perlu membuka perangkat grafis Windows karena showtexttidak bekerja dengan baik dengan perangkat grafis bawaan 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 : solusi lain untuk digunakan showtextdi RStudio. Jalankan kode berikut di awal sesi R ( sumber )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)
Tung
sumber
1
Terima kasih, saya berharap untuk mencobanya!
EngBIRD
1
terima kasih seribu kali ... paket membuatnya sangat mudah untuk a) memverifikasi keluarga font apa yang Anda miliki untuk ggplot dengan font_families () - b) mencari nama file font dengan font_files () - c) menambahkan file font sebagai keluarga fonta dengan font_add (family, font_file_name). Luar biasa !!!
Agile Bean
@AgileBean: senang saya bisa membantu :)
Tung
1
penting: Anda semua harus menginstal paket XQuartz dari xquartz.org terlebih dahulu, atau Anda akan mendapatkan error non-descript saat mencoba memuat library.
ivo Welch
Solusi ini tidak berhasil untuk saya. Saya masih mendapatkan font default, baik di jendela dan jendela plot Rstudio.
GreenManXY
10

Jawaban sederhana jika Anda tidak ingin menginstal sesuatu yang baru

Untuk mengubah semua font di plot Anda plot + theme(text=element_text(family="mono"))Dimana monofont yang Anda pilih.

Daftar opsi font default:

  • mono
  • tanpa
  • serif
  • Kurir
  • Helvetica
  • Waktu
  • AvantGarde
  • Sarjana
  • Helvetica-Narrow
  • NewCenturySchoolbook
  • Palatino
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R tidak memiliki cakupan font yang bagus dan, seperti yang ditunjukkan oleh Mike Wise , R menggunakan nama yang berbeda untuk font yang umum.

Halaman ini membahas font default secara detail.

DA Wells
sumber
4

Terlambat ke pesta, tapi ini mungkin menarik bagi orang yang ingin menambahkan font khusus ke ggplotsdalam shinyaplikasi mereka di shinyapps.io.

Kamu bisa:

  1. Tempatkan font khusus di wwwdirektori: mis. IndieFlower.ttfDari sini
  2. Ikuti langkah-langkah dari sini

Ini mengarah ke bagian atas berikut di dalam app.Rfile:

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

Aplikasi contoh lengkap dapat ditemukan di sini .

simbolrush
sumber
3

Untuk mengubah font secara global untuk plot ggplot2.

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