Thay đổi phông chữ trong ggplot2


93

Đã có lúc, tôi đã thay đổi ggplot2phông chữ của mình bằng cách sử dụng windowsFonts(Times=windowsFont("TT Times New Roman"))để thay đổi nó. Bây giờ tôi không thể thoát khỏi điều này.

Trong cố gắng để thiết lập family=""trong ggplot2 theme()tôi dường như không thể tạo ra một sự thay đổi trong các phông chữ như tôi biên dịch MWe dưới đây với gia đình phông chữ khác nhau.

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 đang trả về một cảnh báo font family not found in Windows font database, nhưng có một hướng dẫn mà tôi đang làm theo (nếu tôi có thể tìm lại được, tôi sẽ cập nhật liên kết ở đây) cho biết điều này là bình thường và không phải là vấn đề. Ngoài ra, bằng cách nào đó, điều này đã hoạt động tại một thời điểm vì biểu đồ của tôi đã từng sử dụng một số phông chữ loại arial hoặc helvitica. Tôi nghĩ rằng đây luôn là một cảnh báo hiện tại ngay cả trong lần di chuyển đầu tiên.

CẬP NHẬT

khi tôi chạy windowsFonts()đầu ra của tôi là

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier New"

Tuy nhiên, đây là sau khi tôi chạy font_import()vì vậy tôi chỉ có thể kết luận rằng phông chữ của tôi không được lưu ở đúng nơi. Mã chạy font_import()yêu cầu thực sự tải các thư viện với:

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

2
Đây có phải là câu hỏi và câu trả lời dành riêng cho từng cửa sổ không? Có ai muốn tổng quát hóa cho Linux không?
smci

2
Ngoài ra, windowsFontsbiến mất khỏi grDevices sau 3.4.1 . Mã ở đây cần được cập nhật.
smci

1
@smci: xem cái nàycái này . Bạn chỉ cần chỉ định đúng đường dẫn trong Linux
Tung

Câu trả lời:


125

Tôi nghĩ bạn vừa bỏ lỡ một bước khởi tạo.

Bạn có thể xem những phông chữ bạn có sẵn bằng lệnh windowsFonts(). Ví dụ: của tôi trông giống như thế này khi tôi bắt đầu nhìn vào cái này:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Sau khi nạp gói extraFont và chạy font_importnhư thế này (mất khoảng 5 phút):

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

Tôi đã có nhiều thứ khác sẵn có - có thể nói là quá nhiều, chắc chắn là quá nhiều để liệt kê ở đây.

Sau đó, tôi đã thử mã của bạn:

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)

mang lại điều này:

nhập mô tả hình ảnh ở đây

Cập nhật:

Bạn có thể tìm thấy tên phông chữ bạn cần cho familytham số element_textbằng đoạn mã sau:

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

Và sau đó:

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)

sản lượng: nhập mô tả hình ảnh ở đây


Cảm ơn sự giúp đỡ, một nửa chặng đường đó. Bây giờ tôi có thể chuyển đổi giữa mono||sans(chúng trông không khác gì cho đến nay) và loadFonts` của serif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my đã thành công. Khi tôi gọi, fonts()tôi có một danh sách gần 300 phông chữ, nhưng tôi đoán là chúng chưa được cài đặt cho môi trường cục bộ khiến chúng có thể truy cập được vào thiết bị windows. Tôi không chắc điều đó có hợp lý không, nhưng tôi đã cố gắng cung cấp bản cập nhật cho câu hỏi ban đầu của mình bằng các đoạn mã có thể hữu ích. Cảm ơn một lần nữa!
EngBIRD

Cảm ơn vì bản cập nhật đoạn mã tên đó, nó trông rất hữu ích, làm thế nào mà truyện tranh của bạn sans ví dụ Ms lại tạo ra giao diện phù hợp nếu gia đình là chuỗi duy nhất mà tôi nhận ra.
EngBIRD

Sự may mắn. Trong phông chữ đó (và trong nhiều phông chữ khác), họ cũng giống như giá trị gia đình. Vì vậy, wf[which(wf=="Comic Sans MS")]sản lượng$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise

Cảm ơn, bạn có biết liệu có thể chuyển hướng hoặc tải các phông chữ từ một nơi cụ thể không? Tức là Ngay cả để cài đặt phông chữ tải hoặc chỉ định phông chữ? Tôi không nhận được các cửa sổ thêm phông chữ có thể nhìn thấy khi lặp lại những cuộc gọi hiển thị tóm tắt ...
EngBIRD

Bạn có chạy font_import và loadfonts () ngay sau nhau không?
Mike Wise

40

Một tùy chọn khác là sử dụng showtextgói hỗ trợ nhiều loại phông chữ hơn (TrueType, OpenType, Loại 1, phông chữ web, v.v.) và nhiều thiết bị đồ họa hơn, đồng thời tránh sử dụng phần mềm bên ngoài như Ghostscript.

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

Nhập một số Phông chữ của Google

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

Tải phông chữ từ đường dẫn tìm kiếm hiện tại vào 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() 

Cốt truyện: cần mở thiết bị đồ họa Windows vì showtextkhông hoạt động tốt với thiết bị đồ họa tích hợp 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) 

Chỉnh sửa : một giải pháp khác để sử dụng showtexttrong RStudio. Chạy đoạn mã sau vào đầu phiên R ( nguồn )

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

1
Cảm ơn, tôi rất mong được thử cái này!
EngBIRD

1
cảm ơn bạn một nghìn lần ... gói này giúp bạn dễ dàng hơn a) xác minh họ phông chữ nào bạn có sẵn cho ggplot bằng cách font_families () - b) tìm kiếm tên tệp phông chữ bằng font_files () - c) thêm tệp phông chữ như một họ phông chữ theo font_add (family, font_file_name). Tuyệt vời!!!
Agile Bean

@AgileBean: vui vì tôi có thể giúp :)
Tùng

1
quan trọng: trước hết bạn phải cài đặt gói XQuartz từ xquartz.org , nếu không bạn sẽ gặp lỗi không phải mô tả khi cố gắng tải thư viện.
ivo Welch

Các giải pháp này không làm việc cho tôi. Tôi vẫn nhận được phông chữ mặc định, cả trong cửa sổ và cửa sổ âm mưu của Rstudio.
GreenManXY

10

Một câu trả lời đơn giản nếu bạn không muốn cài đặt bất kỳ thứ gì mới

Để thay đổi tất cả các phông chữ trong âm mưu của bạn plot + theme(text=element_text(family="mono"))đâu monolà phông chữ bạn đã chọn.

Danh sách các tùy chọn phông chữ mặc định:

  • bệnh tăng bạch cầu đơn nhân
  • không
  • serif
  • Chuyển phát nhanh
  • Helvetica
  • Times
  • Tiên phong
  • Bookman
  • Helvetica-Hẹp
  • NewCenturySchoolbook
  • Palatino
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R không có độ bao phủ phông chữ lớn và như Mike Wise đã chỉ ra, R sử dụng các tên khác nhau cho các phông chữ phổ biến.

Trang này xem xét các phông chữ mặc định một cách chi tiết.


4

Đến muộn, nhưng điều này có thể gây chú ý cho những người đang tìm cách thêm phông chữ tùy chỉnh vào ggplotsbên trong shinyứng dụng của họ trên glossapps.io.

Bạn có thể:

  1. Đặt phông chữ tùy chỉnh trong wwwthư mục: ví dụ IndieFlower.ttftừ đây
  2. Làm theo các bước từ đây

Điều này dẫn đến phần trên sau bên trong app.Rtệp:

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

Một ứng dụng ví dụ đầy đủ có thể được tìm thấy ở đây .


3

Để thay đổi phông chữ trên toàn cầu cho các lô ggplot2.

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.