Зміна шрифтів у ggplot2


92

Колись я змінив 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"

Але це після того, як я побіг, 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

Відповіді:


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

Дякую за оновлення фрагмента імен, виглядає дуже корисно, як ваш приклад комічного без Ms створив правильний вигляд, якщо сім'я - це єдиний рядок, який розпізнає моя установка.
EngBIRD

Удача. У цьому шрифті (і в багатьох інших) прізвище збігається із сімейним значенням. Так wf[which(wf=="Comic Sans MS")]поступається$``Comic Sans MS`` [1] "Comic Sans MS"
Майк Вайз

Дякую, чи знаєте ви, чи можна направити або завантажити шрифти з певного місця? Тобто Навіть для встановлення завантажувальних шрифтів або вказівки шрифтів? Я не отримую додаткових видимих ​​шрифтів вікон при повторенні підсумкового виклику дисплея ...
EngBIRD

Ви запускали font_import та loadfonts () одразу один за одним?
Mike Wise

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
дякую тисячу разів ... за допомогою пакету надзвичайно легко: 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

10

Проста відповідь, якщо ви не хочете встановлювати нічого нового

Змінити всі шрифти у вашому сюжеті plot + theme(text=element_text(family="mono"))Де monoзнаходиться вибраний вами шрифт.

Список параметрів шрифту за замовчуванням:

  • мононуклеоз
  • sans
  • засечка
  • Кур'єр
  • Гельветика
  • Часи
  • AvantGarde
  • Букмекер
  • Гельветика-Вузька
  • NewCenturySchoolbook
  • Палатіно
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • СтоліттяЩ
  • URWPalladio
  • URWTimes
  • NimbusRom

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')

Повний приклад програми можна знайти тут .


3

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

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.