การเปลี่ยนฟอนต์ใน ggplot2


97

กาลครั้งหนึ่งฉันเปลี่ยนggplot2แบบอักษรโดยใช้windowsFonts(Times=windowsFont("TT Times New Roman"))การเปลี่ยน ตอนนี้ฉันไม่สามารถตัดใจจากเรื่องนี้ได้

ในการพยายามตั้งค่าfamily=""ในggplot2 theme()ฉันดูเหมือนจะไม่สามารถสร้างการเปลี่ยนแปลงในแบบอักษรได้เนื่องจากฉันรวบรวม MWE ด้านล่างด้วยตระกูลแบบอักษรที่แตกต่างกัน

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 กำลังส่งคืนคำเตือนfont family not found in Windows font databaseแต่มีบทช่วยสอนที่ฉันติดตามอยู่ (หากหาได้อีกฉันจะอัปเดตลิงค์ที่นี่) ซึ่งบอกว่านี่เป็นเรื่องปกติและไม่ใช่ปัญหา นอกจากนี้สิ่งนี้ได้ผลในจุดหนึ่งเนื่องจากกราฟของฉันเคยใช้ฟอนต์ประเภท arial หรือ helvitica ฉันคิดว่านี่เป็นคำเตือนในปัจจุบันเสมอแม้ในช่วงแรกของการโยกย้าย

อัปเดต

เมื่อฉันเรียกใช้windowsFonts()ผลลัพธ์ของฉันคือ

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier ใหม่"

แต่นี่คือหลังจากที่ฉันรันfont_import()ดังนั้นฉันจึงสามารถสรุปได้ว่าฟอนต์ของฉันไม่ได้รับการบันทึกในตำแหน่งที่ถูกต้อง รหัสที่รันfont_import()คำขอจะโหลดไลบรารีด้วย:

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

2
คำถามนี้เป็นคำถามและคำตอบเฉพาะสำหรับ Windows หรือไม่ มีใครอยากพูดถึง Linux บ้างไหม?
smci

2
นอกจากนี้windowsFontsหายไปจาก grDevices หลังจาก 3.4.1 รหัสที่นี่จำเป็นต้องอัปเดต
smci

1
@smci: เห็นนี้และนี้ คุณต้องระบุเส้นทางที่ถูกต้องใน Linux
Tung

คำตอบ:


129

ฉันคิดว่าคุณพลาดขั้นตอนเริ่มต้น

windowsFonts()คุณสามารถมองเห็นสิ่งที่คุณมีแบบอักษรที่สามารถใช้ได้กับคำสั่ง ตัวอย่างของฉันมีลักษณะเช่นนี้เมื่อฉันเริ่มดูสิ่งนี้:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

หลังจากติดตั้งแพคเกจ extraFont และเรียกใช้font_importเช่นนี้ (ใช้เวลาประมาณ 5 นาที):

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

ฉันมีรายการอื่น ๆ อีกมากมาย - เป็นที่ถกเถียงกันมากเกินไปมีรายการที่นี่มากเกินไป

จากนั้นฉันลองใช้รหัสของคุณ:

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)

ให้สิ่งนี้:

ป้อนคำอธิบายภาพที่นี่

อัปเดต:

คุณสามารถค้นหาชื่อแบบอักษรที่คุณต้องการสำหรับfamilyพารามิเตอร์element_textด้วยข้อมูลโค้ดต่อไปนี้:

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

แล้ว:

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)

ผลตอบแทน: ป้อนคำอธิบายภาพที่นี่


ขอบคุณสำหรับความช่วยเหลือมีครึ่งทาง ฉันสามารถสลับระหว่างmono||sans(ซึ่งดูไม่แตกต่างกันจนถึงตอนนี้) และserif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my loadFonts` สำเร็จแล้ว เมื่อฉันโทรหาfonts()ฉันมีรายการแบบอักษรเกือบ 300 แบบ แต่ฉันเดาว่าพวกเขาไม่ได้ติดตั้งในสภาพแวดล้อมท้องถิ่นทำให้สามารถเข้าถึงอุปกรณ์ windows ได้ ฉันไม่แน่ใจว่าเหมาะสมหรือไม่ แต่ฉันพยายามอัปเดตคำถามเดิมของฉันด้วยตัวอย่างข้อมูลที่อาจช่วยได้ ขอบคุณอีกครั้ง!
EngBIRD

ขอบคุณสำหรับการอัปเดตตัวอย่างชื่อมันดูมีประโยชน์มากตัวอย่างการ์ตูนของคุณ sans Ms สร้างลักษณะที่เหมาะสมได้อย่างไรหากตระกูลเป็นสตริงเดียวที่การติดตั้งของฉันรู้จัก
EngBIRD

โชค. ในแบบอักษรนั้น (และอื่น ๆ อีกมากมาย) ชื่อสกุลจะเหมือนกับค่าครอบครัว ให้wf[which(wf=="Comic Sans MS")]ผลตอบแทน$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise

ขอบคุณคุณทราบหรือไม่ว่าเป็นไปได้ที่จะสั่งหรือโหลดแบบอักษรจากที่ใดที่หนึ่ง เช่นสำหรับการติดตั้งแบบอักษรโหลดหรือระบุแบบอักษร? ฉันไม่ได้รับแบบอักษรที่มองเห็นได้ของหน้าต่างเพิ่มเติมเมื่อทำซ้ำการเรียกการแสดงผลสรุป ...
EngBIRD

คุณเรียกใช้ font_import และ loadfonts () ต่อกันหรือไม่
Mike Wise

43

อีกทางเลือกหนึ่งคือการใช้showtextแพ็กเกจที่รองรับฟอนต์หลายประเภท (TrueType, OpenType, Type 1, แบบอักษรบนเว็บ ฯลฯ ) และอุปกรณ์กราฟิกอื่น ๆ และหลีกเลี่ยงการใช้ซอฟต์แวร์ภายนอกเช่น Ghostscript

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

นำเข้า Google Fonts

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

โหลดแบบอักษรจากเส้นทางการค้นหาปัจจุบันลงใน 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() 

เรื่องshowtextย่อ: จำเป็นต้องเปิดอุปกรณ์กราฟิก Windows เนื่องจากไม่สามารถทำงานได้ดีกับอุปกรณ์กราฟิกในตัวของ 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) 

แก้ไข : วิธีแก้ปัญหาอื่นที่จะใช้showtextใน RStudio เรียกใช้รหัสต่อไปนี้ที่จุดเริ่มต้นของเซสชัน R (ที่มา )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)

แก้ไข 2 : ตั้งแต่เวอร์ชัน 0.9 เป็นต้นไป showtext สามารถทำงานร่วมกับอุปกรณ์กราฟิก RStudio (RStudioGD) ได้ดี เพียงแค่โทรshowtext_auto()ในเซสชัน RStudio จากนั้นพล็อตจะแสดงอย่างถูกต้อง


1
ขอบคุณฉันหวังว่าจะได้ลองสิ่งนี้!
EngBIRD

1
ขอบคุณพันครั้ง ... แพคเกจช่วยให้ a) ตรวจสอบตระกูลฟอนต์ที่คุณมีให้สำหรับ ggplot โดย font_families () - b) ค้นหาชื่อไฟล์ฟอนต์โดย font_files () - c) การเพิ่มไฟล์ฟอนต์ เป็นตระกูลฟอนต์โดย font_add (family, font_file_name) เจ๋ง !!!
Agile Bean

@AgileBean: ดีใจที่ช่วยได้ :)
ตุง

1
สำคัญ: คุณต้องติดตั้งแพ็คเกจ XQuartz จากxquartz.orgก่อนไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดที่ไม่สามารถอธิบายได้ในการพยายามโหลดไลบรารี
ivo Welch

วิธีแก้ปัญหานี้ใช้ไม่ได้กับฉัน ฉันยังคงได้รับฟอนต์เริ่มต้นทั้งในหน้าต่างและหน้าต่างพล็อตของ Rstudio
GreenManXY

11

คำตอบง่ายๆหากคุณไม่ต้องการติดตั้งอะไรใหม่

หากต้องการเปลี่ยนฟอนต์ทั้งหมดในพล็อตของคุณฟอนต์ที่คุณเลือกplot + theme(text=element_text(family="mono"))อยู่ที่ไหนmono

รายการตัวเลือกแบบอักษรเริ่มต้น:

  • โมโน
  • ซอง
  • เซริฟ
  • ผู้จัดส่ง
  • Helvetica
  • ครั้ง
  • AvantGarde
  • บุ๊คแมน
  • Helvetica- แคบ
  • NewCenturySchoolbook
  • ปาลาติโน
  • URW โกธิค
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R ไม่มีการครอบคลุมแบบอักษรที่ดีและดังที่Mike Wiseชี้ให้เห็น R ใช้ชื่ออื่นสำหรับฟอนต์ทั่วไป

หน้านี้แสดงรายละเอียดแบบอักษรเริ่มต้น


4

สายไปงานปาร์ตี้ แต่อาจเป็นที่สนใจสำหรับผู้ที่ต้องการเพิ่มแบบอักษรที่กำหนดเองggplotsในshinyแอปบน shinyapps.io

คุณสามารถ:

  1. วางฟอนต์ที่กำหนดเองในwwwไดเร็กทอรี: เช่นIndieFlower.ttfจากที่นี่
  2. ทำตามขั้นตอนจากที่นี่

สิ่งนี้นำไปสู่ส่วนบนต่อไปนี้ภายในapp.Rไฟล์:

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

การตรวจสอบตัวอย่างเต็มสามารถพบได้ที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.