Изменение шрифтов в ggplot2
Когда-то я изменил шрифт 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 New"
Но это после того, как я запустил font_import()
, поэтому могу только сделать вывод, что мои шрифты не сохраняются в нужном месте. Код, который запускал запрос font_import()
, фактически загружает библиотеки:
LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
.libPaths(c(LocalLibraryLocation, .libPaths()))
Ответы
Ответ 1
Вы просто пропустили шаг инициализации, я думаю.
Вы можете видеть, какие шрифты у вас есть с командой 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)
получив следующее:
![введите описание изображения здесь]()
Update:
Вы можете найти имя шрифта, необходимого для параметра 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)
дает:
![введите описание изображения здесь]()
Ответ 2
Другой вариант - использовать пакет showtext
, который поддерживает больше типов шрифтов (TrueType, OpenType, Type 1, веб-шрифты и т.д.) И большее количество графических устройств, и избегает использования внешнего программного обеспечения, такого как Ghostscript.
# install.packages('showtext', dependencies = TRUE)
library(showtext)
Импортируйте некоторые шрифты Google
# 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()
Сюжет: необходимо открыть графическое устройство Windows, так как showtext
не работает со встроенным графическим устройством RStudio
# https://github.com/yixuan/showtext/issues/7
# https://journal.r-project.org/archive/2015-1/qiu.pdf
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)
Ответ 3
Поздно на вечеринке, но это может быть интересно тем, кто хочет добавить свои шрифты к своим ggplots
в shiny
приложении на shinyapps.io.
Вы можете:
- Поместите пользовательский шрифт в каталог
www
: например, IndieFlower.ttf
отсюда - Следуйте инструкциям отсюда
Это приводит к следующему верхнему разделу внутри файла app.R
:
dir.create('~/.fonts')
file.copy("www/IndieFlower.ttf", "~/.fonts")
system('fc-cache -f ~/.fonts')
Полный пример приложения можно найти здесь.