Смена шрифтов в ggplot2

91

Давным-давно я изменил свой 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()))
EngBIRD
источник
2
Это вопрос и ответ для Windows? Кто-нибудь хочет обобщить на Linux?
smci
2
Также windowsFontsисчез из grDevices после 3.4.1 . Код здесь нуждается в обновлении.
smci
1
@smci: посмотрите это и это . Вам просто нужно указать правильный путь в Linux
Tung

Ответы:

124

Думаю, вы просто пропустили шаг инициализации.

Вы можете увидеть, какие шрифты у вас есть, с помощью команды 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
Спасибо за обновление фрагмента имен, это выглядит очень полезным, как ваш пример comic sans Ms произвел правильный внешний вид, если семейство - единственная строка, которую моя установка распознает.
EngBIRD
Удачи. В этом шрифте (и во многих других) имя семейства совпадает с семейным значением. Так wf[which(wf=="Comic Sans MS")]уступает$``Comic Sans MS`` [1] "Comic Sans MS"
Майк Уайз
Спасибо, знаете ли вы, можно ли направить или загрузить шрифты из определенного места? Т.е. даже для установки загрузочных шрифтов или указания шрифтов? Я не получаю видимые шрифты дополнительных окон при повторении вызова сводного дисплея ...
EngBIRD
Вы запускали font_import и loadfonts () сразу после друг друга?
Майк Уайз
39

Другой вариант - использовать 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
# `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)
Тунг
источник
1
Спасибо, я с нетерпением жду возможности попробовать это!
EngBIRD
1
тысячу раз спасибо ... пакет позволяет очень легко: а) проверить, какие семейства шрифтов у вас есть для ggplot с помощью font_families () - b) искать имена файлов шрифтов с помощью font_files () - c) добавить файл шрифта как семейство шрифтов от font_add (family, font_file_name). Потрясающие!!!
Agile Bean
@AgileBean: рад, что смог помочь :)
Tung
1
важно: вы должны сначала установить пакет XQuartz с xquartz.org , иначе вы получите неописуемую ошибку при попытке загрузить библиотеку.
ivo Welch
Это решение не работает для меня. Я по-прежнему получаю шрифт по умолчанию как в окне, так и в окне графика Rstudio.
GreenManXY
9

Простой ответ, если не хочешь устанавливать ничего нового

Чтобы изменить все шрифты в вашем сюжете. plot + theme(text=element_text(family="mono"))Где monoваш выбранный шрифт.

Список вариантов шрифта по умолчанию:

  • мононуклеоз
  • без
  • засечки
  • Курьер
  • Helvetica
  • Раз
  • AvantGarde
  • Книжник
  • Helvetica-Narrow
  • NewCenturyУчебник
  • Палатино
  • URWГотика
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • НимбусРом

R не имеет большого охвата шрифтов, и, как указывает Майк Уайз , 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')

Полный пример приложения можно найти здесь .

символ
источник
2

Чтобы изменить шрифт глобально для графиков ggplot2.

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
Антекс
источник