ShowText позволяет легко использовать различные типы шрифтов (trueType, opentype, тип 1, веб -шрифты и т. Д.) На графиках R. Мотивация для разработки этого пакета заключается в том, что использование нестандартных шрифтов на графиках R (особенно для устройства PDF) не является простым, например, при создании PDF с китайскими иерогликами. Это связано с тем, что большинство стандартных шрифтов, используемых pdf() не содержат глифов китайского символа, и пользователи вряд ли могут использовать системные шрифты в R.
Пакет Extrafont, разработанный Winston Chang, является одним из хороших решений этой проблемы, которое в основном фокусируется на использовании шрифтов Truetype ( .ttf ) в графическом устройстве PDF. Теперь ShowText может поддерживать больше форматов шрифтов и больше графических устройств и избегать использования внешнего программного обеспечения, такого как GhostScript.
library( showtext )
# # Loading Google fonts (https://fonts.google.com/)
font_add_google( " Gochi Hand " , " gochi " )
font_add_google( " Schoolbell " , " bell " )
font_add_google( " Covered By Your Grace " , " grace " )
font_add_google( " Rock Salt " , " rock " )
# # Automatically use showtext to render text for future devices
showtext_auto()
# # Tell showtext the resolution of the device,
# # only needed for bitmap graphics. Default is 96
showtext_opts( dpi = 96 )
set.seed( 123 )
x = rnorm( 10 )
y = 1 + x + rnorm( 10 , sd = 0.2 )
y [ 1 ] = 5
mod = lm( y ~ x )
op = par( cex.lab = 2 , cex.axis = 1.5 , cex.main = 2 )
plot( x , y , pch = 16 , col = " steelblue " ,
xlab = " X variable " , ylab = " Y variable " , family = " gochi " )
grid()
title( " Draw Plots Before You Fit A Regression " , family = " bell " )
text( - 0.5 , 4.5 , " This is the outlier " , cex = 2 , col = " steelblue " ,
family = " grace " )
abline(coef( mod ))
abline( 1 , 1 , col = " red " )
par( family = " rock " )
text( 1 , 1 , expression(paste( " True model: " , y == x + 1 )),
cex = 1.5 , col = " red " , srt = 20 )
text( 0 , 2 , expression(paste( " OLS: " , hat( y ) == 0.79 * x + 1.49 )),
cex = 1.5 , srt = 15 )
legend( " topright " , legend = c( " Truth " , " OLS " ), col = c( " red " , " black " ), lty = 1 )
par( op ) В этом примере мы сначала загружаем некоторые шрифты, которые доступны в Интернете через шрифты Google, а затем сообщаем R рендеринг текст, используя ShowText , вызывая функцию showtext_auto() . Вся оставшаяся часть точно такая же, как обычные команды построения.
Этот пример должен работать на большинстве графических устройств, включая pdf() , png() , postscript() и на экране, такие как windows() в Windows и x11() на Linux.
Позвольте мне сначала немного объяснить, как работает pdf() .
Насколько мне известно, устройство PDF по умолчанию в R не «рисует» текст, но на самом деле «описывает» текст в файле PDF. То есть вместо рисования линий и кривых фактического глифа он только встраивает информацию о тексте, например, какие у него символы, которые он использует, и т. Д.
Однако текст с объявленным шрифтом может отображаться по -разному в разных ОС, что означает, что внешний вид графа, созданный pdf() зависит от системы. Если, к сожалению, у вас нет объявленного шрифта в вашей системе, вы, возможно, не сможете правильно увидеть текст.
Для сравнения, ShowText Package пытается решить эту проблему, преобразуя текст в заполненные цветными полигональными контурами (для векторной графики) или растровых изображений (для растрового изображения и графики на экране), что имеет одинаковый внешний вид на всех платформах. Людям, которые просматривают этот график, не должны устанавливать шрифт, который создает график. Это обеспечивает удобство как для производителей графиков, так и для зрителей.
Что еще более важно, ShowText может использовать системные файлы шрифтов, поэтому вы можете отображать текст на графике с вашим любимым лицом шрифта, если он поддерживается Freetype. См. Раздел «Загрузка шрифтов» ниже.
Чтобы создать график, используя указанный шрифт, вы просто делаете следующее:
Только шаги, отмеченные (*), являются новыми. Если вы хотите использовать ShowText глобально, вы можете позвонить в функцию showtext_auto() один раз, а затем все устройства после этого автоматически используют ShowText для рендеринга, как показано пример в начале.
Если вы хотите иметь более тонкий элемент управления, в какой части кода следует использовать ShowText , функции showtext_begin() и showtext_end() помогут. Только построение функций, заключенных в эту пару вызовов, будет использовать ShowText , а другие нет. Например, чтобы изменить только шрифт заголовка, мы можем сделать:
library( showtext )
font_add_google( " Schoolbell " , " bell " )
# # By default the automatic call of showtext is disabled
# # You can manually turn it off using the line below
# # showtext_auto(enable = FALSE)
# # To use showtext_begin() and showtext_end() you need to
# # explicitly open a graphics device
png( " demo.png " , 700 , 600 , res = 96 )
set.seed( 123 )
x = rnorm( 10 )
y = 1 + x + rnorm( 10 , sd = 0.2 )
y [ 1 ] = 5
mod = lm( y ~ x )
op = par( cex.lab = 1.5 , cex.axis = 1.5 , cex.main = 2 )
plot( x , y , pch = 16 , col = " steelblue " ,
xlab = " X variable " , ylab = " Y variable " )
grid()
# # Use showtext only for this part
showtext_begin()
title( " Draw Plots Before You Fit A Regression " , family = " bell " )
showtext_end()
text( - 0.5 , 4.5 , " This is the outlier " , cex = 2 , col = " steelblue " )
abline(coef( mod ))
abline( 1 , 1 , col = " red " )
text( 1 , 1 , expression(paste( " True model: " , y == x + 1 )),
cex = 1.5 , col = " red " , srt = 20 )
text( 0 , 2 , expression(paste( " OLS: " , hat( y ) == 0.79 * x + 1.49 )),
cex = 1.5 , srt = 15 )
legend( " topright " , legend = c( " Truth " , " OLS " ), col = c( " red " , " black " ), lty = 1 )
par( op )
dev.off()Загрузка шрифта на самом деле выполняется с помощью Sackfonts .
Легкий способ загрузить шрифт в Showtext - позвонить в font_add(family, regular) , где family - это имя, которое вы назначаете этому шрифту (так что позже вы можете позвонить в par(family = ...) , чтобы использовать этот шрифт при заговоре), и regular является путь к файлу шрифта. То есть только знания «имени шрифта» недостаточно, поскольку они обычно зависят от системы. Напротив, файл шрифта - это объект, который фактически предоставляет глифы символов.
Обычно файлы шрифтов расположены в некоторых «стандартных» каталогах в системе (например, в Windows, это обычно C:WindowsFonts ). Вы можете использовать font_paths() для проверки текущего пути поиска или добавить новый, и использовать font_files() для перечисления доступных файлов шрифтов в пути поиска. font_files() также перечисляет некоторую другую полезную информацию, например, фамилию, которую вы обычно используете для указания шрифта, и лицо шрифта для различных вариантов. Ниже приведен пример, чтобы показать результаты на моей машине:
head(font_files())
# # path file family
# # 1 ***/.local/share/fonts Flavors-Regular.ttf Flavors
# # 2 ***/.local/share/fonts FrederickatheGreat-Regular.ttf Fredericka the Great
# # 3 ***/.local/share/fonts GandhiSerif-Bold.otf Gandhi Serif
# # 4 ***/.local/share/fonts GandhiSerif-BoldItalic.otf Gandhi Serif
# # 5 ***/.local/share/fonts GandhiSerif-Italic.otf Gandhi Serif
# # 6 ***/.local/share/fonts GandhiSerif-Regular.otf Gandhi Serif
# #
# # face version ps_name
# # 1 Regular Version 1.001 Flavors-Regular
# # 2 Regular Version 1.001 FrederickatheGreat-Regular
# # 3 Bold Version 1.001 GandhiSerif-Bold
# # 4 Bold Italic Version 1.001 GandhiSerif-BoldItalic
# # 5 Italic Version 1.001 GandhiSerif-Italic
# # 6 Regular Version 1.001 GandhiSerif-RegularИ приведенный ниже код демонстрирует, как загружать и использовать системные шрифты в Windows:
library( showtext )
# # Add fonts that are available on Windows
font_add( " heiti " , " simhei.ttf " )
font_add( " constan " , " constan.ttf " , italic = " constani.ttf " )
library( ggplot2 )
p = ggplot( NULL , aes( x = 1 , y = 1 )) + ylim( 0.8 , 1.2 ) +
theme( axis.title = element_blank(), axis.ticks = element_blank(),
axis.text = element_blank()) +
annotate( " text " , 1 , 1.1 , family = " heiti " , size = 15 ,
label = " u 4F60 u 597D u FF0C u 4E16 u 754C " ) +
annotate( " text " , 1 , 0.9 , label = ' Chinese for "Hello, world!" ' ,
family = " constan " , fontface = " italic " , size = 12 )
# # Automatically use showtext for new devices
showtext_auto()
# # On-screen device
x11()
print( p )
dev.off()
# # PDF device
pdf( " showtext-example-3.pdf " , 7 , 4 )
print( p )
dev.off()
# # PNG device
ggsave( " showtext-example-4.png " , width = 7 , height = 4 , dpi = 96 )
# # Turn off if no longer needed
showtext_auto( FALSE ) Для другой ОС у вас может не быть файла шрифта simhei.ttf , но нет никаких трудностей в использовании чего -то другого. В настоящее время font_add() поддерживает шрифты TrueType (*. TTF/*. TTC) и шрифты OpenType (*. OTF), и добавление нового типа шрифта является тривиальным, пока Freetype поддерживает его.
Кроме того, в Интернете есть много бесплатных шрифтов, например, проекта Google Fonts (https://fonts.google.com/). Sysfonts предоставляет интерфейс для автоматической загрузки и регистрации этих шрифтов через функцию font_add_google() , как показано в примере ниже.
library( showtext )
font_add_google( " Lobster " , " lobster " )
showtext_auto()
plot( 1 , pch = 16 , cex = 3 )
text( 1 , 1.1 , " A fancy dot " , family = " lobster " , col = " steelblue " , cex = 3 ) ShowText включает в себя CJK с открытым исходным кодом (китайский, японский и корейский) Font Wenquanyi Micro Hei. Если вы просто хотите показать текст CJK на своем графике, просто укажите фамилию wqy-microhei в построении функций.
Другим вариантом является установка шрифтов Source Han Sans/Serif локально, используя следующий код:
library( showtext )
font_install(source_han_serif())
font_families()
# # [1] "sans" "serif" "mono" "wqy-microhei"
# # [5] "source-han-serif-cn" Смотрите ?font_install и ?source_han для получения более подробной информации.
Каждое графическое устройство в R реализует некоторые функции для рисования конкретных графических элементов, например, path() и polygon() для рисования полигонов, raster() для отображения изображений растрового изображения, text() или TextUtf8 textUTF8() , чтобы показать текст и raster() . Д. То, что showtext делает для переопределения своих собственных функций рендеринга текста и заменить их на Dravers Phits path() Paths.
Это действие выполняется только тогда, когда вы вызовите showtext_begin() и не изменяют графическое устройство, если вы вызовите showtext_end() чтобы восстановить исходные функции устройства обратно.
Начиная с версии 0.9, ShowText может хорошо работать с графическим устройством RSTUDIO (RSTUDIOGD). Просто вызовите showtext_auto() в сеансе RStudio, а затем графики будут отображаться правильно.