#r #ggplot2 #fonts #extrafont
Вопрос:
Я написал функцию для обмена данными между коллегами для построения графиков, и моя организация предпочитает Calibri для текста по умолчанию ggplot2 Arial. Если бы я был единственным человеком, который использовал бы эту функцию, я бы сначала сделал это в верхней части своего сценария:
library(extrafont)
font_import()
loadfonts(device="win")
а затем составьте мой график ggplot2. Кажется, мне нужно сделать это только font_import()
один раз на данной машине, но затем мне нужно делать loadfonts(device="win")
это каждый раз, когда я начинаю новый сеанс. Я не очень хорошо разбираюсь в том, что они делают, но если я не выполню этот loadfonts
шаг, мой график не будет использовать Calibri.
Я бы хотел, чтобы функция построения графиков, которую я написал, работала для других, и я хотел бы проверить, выполнили ли они уже эти шаги, и дать им полезное сообщение об этом, если они этого не сделали. Я думал, что смогу использовать fonts()
, а затем проверить, был ли Calibri указан в выходных данных, но я думаю, что это проверяет только те шрифты, которые я когда-либо загружал font_import()
за всю историю использования этой машины. Я также подумал, что, может быть,
systemfonts::match_font("Calibri")
проверил бы, но я получаю тот же результат независимо от того , бегал ли я уже loadfonts(...
, так что это тоже не так.
Как проверить, готов ли шрифт к использованию на графике?
Комментарии:
1. Я думаю
showtext
, что вместо этого вы могли бы использовать шрифт Calibri на других компьютерах без необходимости выполнения шага extrafont::loadfonts.2. Попробуй с
names(grDevices::windowsFonts())
.3. @JonSpring: Что
showtext
делает? Из какой это посылки? Я не могу его найти.4. @стефан: Это подскажет мне, есть ли у меня варианты шрифтов с засечками, без засечек или в монофоническом стиле, но на самом деле это не подскажет мне семейство шрифтов.
5. Согласен с @JonSpring — showtext — это то, как я подошел бы к этой задаче, например
install.packages("showtext"); library(showtext); list_of_fonts <- as.data.frame(font_files()); grep(pattern = "Calibri", x = list_of_fonts$family, ignore.case = TRUE, value = TRUE)
Ответ №1:
Вот один из возможных подходов к определению того, установлен ли Calibri и «пригоден ли он для использования».:
install.packages("showtext")
library(showtext)
list_of_fonts <- as.data.frame(font_files())
grep(pattern = "Calibri", x = list_of_fonts$family, ignore.case = TRUE, value = TRUE)
Вы можете реализовать это несколькими способами, например, загрузить шрифт Calibri, если он доступен, или распечатать сообщение, если оно недоступно в системе:
if (!require(showtext)) install.packages("showtext")
#> Loading required package: showtext
#> Loading required package: sysfonts
#> Loading required package: showtextdb
library(showtext)
list_of_fonts <- as.data.frame(font_files())
if(any(grepl("Calibri.ttf", list_of_fonts, ignore.case = TRUE))){
Calibri <- list_of_fonts[list_of_fonts$file == "Calibri.ttf",]
sysfonts::font_add(family = "Calibri",
regular = list.files(path = Calibri$path,
pattern = "Calibri.ttf",
full.names = TRUE))
print("Calibri available")
} else{
print("Calibri not found")
}
#> [1] "Calibri available"
library(ggplot2)
showtext_auto()
ggplot(mtcars, aes(wt, mpg))
geom_point()
ggtitle("Example plot")
theme(text = element_text(family = "Calibri", size = 22))
Создано 2021-09-29 пакетом reprex (v2.0.1)
N. B. Это должно работать в Windows/macOS/linux, но я тестировал его только на macOS. Кроме того, @JonSpring прокомментировал первым, поэтому, если он опубликует ответ, пожалуйста, примите его вместо моего