O ShowText facilita o uso de vários tipos de fontes (TrueType, OpenType, Tipo 1, fontes da Web, etc.) em gráficos R. A motivação para desenvolver este pacote é que o uso de fontes não padrão em gráficos R (especialmente para dispositivo PDF) não é direto, por exemplo, ao criar PDF com caracteres chineses. Isso ocorre porque a maioria das fontes padrão usadas por pdf() não contém glifos de caracteres chineses, e os usuários dificilmente poderiam usar fontes do sistema em R.
O pacote Extrafont, desenvolvido pela Winston Chang, é uma boa solução para esse problema, que se concentra principalmente no uso de fontes TrueType ( .ttf ) no dispositivo gráfico PDF. Agora, o ShowText é capaz de suportar mais formatos de fonte e mais dispositivos gráficos e evita o uso de software externo, como o 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 ) Neste exemplo, primeiro carregamos algumas fontes disponíveis on -line através do Google Fontes e depois dizemos a R para renderizar texto usando o showText chamando a função showtext_auto() . Toda a parte restante é exatamente a mesma dos comandos de plotagem usual.
Este exemplo deve funcionar na maioria dos dispositivos gráficos, incluindo dispositivos pdf() , png() , postscript() e na tela, como windows() no Windows e x11() no Linux.
Deixe -me primeiro explicar um pouco como pdf() funciona.
Para meu melhor conhecimento, o dispositivo PDF padrão em R não "desenha" o texto, mas na verdade "descreve" o texto no arquivo PDF. Ou seja, em vez de desenhar linhas e curvas do glifo real, ele apenas incorpora informações sobre o texto, por exemplo, quais caracteres ele tem, qual fonte usa etc.
No entanto, o texto com fonte declarada pode ser exibida de maneira diferente em diferentes sistemas operacionais, o que significa que a aparência do gráfico criado por pdf() depende do sistema. Se você, infelizmente, não possui a fonte declarada em seu sistema, talvez não consiga ver o texto corretamente.
Em comparação, o pacote ShowText tenta resolver esse problema convertendo texto em contornos poligonais cheios de cores (para gráficos vetoriais) ou imagens raster (para gráficos de bitmap e na tela), com a mesma aparência em todas as plataformas. As pessoas que veem este gráfico não precisam instalar a fonte que cria o gráfico. Ele fornece conveniência para fabricantes de gráficos e visualizadores de gráficos.
Mais importante, o ShowText pode usar arquivos de fonte do sistema, para que você possa mostrar o texto no gráfico com sua face de fonte favorita, desde que seja suportado pelo Freetype. Consulte a seção Carregando fontes abaixo.
Para criar um gráfico usando uma fonte especificada, basta fazer o seguinte:
Somente as etapas marcadas com (*) são novas. Se você deseja usar o showText globalmente, pode chamar a função showtext_auto() uma vez e, em seguida, todos os dispositivos depois disso usarão automaticamente o showText para renderizar o texto, como mostra o exemplo no início.
Se você deseja ter um controle mais refinado sobre qual parte do código deve usar o showText , as funções showtext_begin() e showtext_end() ajudarão. Somente as funções de plotagem entre este par de chamadas usarão o showText e outras não. Por exemplo, para alterar apenas a fonte do título, podemos fazer:
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()A fonte de carregamento é realmente feita por sysfonts de embalagem.
A maneira mais fácil de carregar a fonte no showText é chamando font_add(family, regular) , onde family é o nome que você atribui a essa fonte (para que mais tarde você possa ligar par(family = ...) para usar essa fonte na plotagem) e regular é o caminho para o arquivo de fonte. Ou seja, apenas conhecer o "nome da fonte" não é suficiente, pois geralmente são dependentes do sistema. Pelo contrário, o arquivo de font é a entidade que realmente fornece os glifos de caracteres.
Geralmente, os arquivos de fonte estão localizados em alguns diretórios "padrão" no sistema (por exemplo, no Windows, normalmente é C:WindowsFonts ). Você pode usar font_paths() para verificar o caminho de pesquisa atual ou adicionar um novo e usar font_files() para listar os arquivos de fonte disponíveis no caminho da pesquisa. font_files() também lista algumas outras informações úteis, por exemplo, o nome da família que você costuma usar para especificar uma fonte e a fonte enfrenta para diferentes variantes. Abaixo está um exemplo para mostrar os resultados na minha máquina:
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-RegularE o código abaixo demonstra como carregar e usar fontes do sistema no 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 ) Para outro sistema operacional, você pode não ter o arquivo de fonte simhei.ttf , mas não há dificuldade em usar outra coisa. Atualmente, font_add() suporta fontes TrueType (*. TTF/*. TTC) e fontes OpenType (*. OTF), e a adição de um novo tipo de fonte é trivial, desde que o Freetype o apoie.
Além disso, existem muitas fontes gratuitas disponíveis e acessíveis na web, por exemplo, o projeto Google Fonts (https://fonts.google.com/). O SYSFONTS fornece uma interface para baixar e registrar automaticamente essas fontes através da função font_add_google() , como mostra o exemplo abaixo.
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 ) O showtext inclui uma fonte CJK de código aberto (chinês, japonês e coreano) Wenquanyi Micro HEI. Se você deseja apenas mostrar o texto do CJK em seu gráfico, basta especificar o nome da família wqy-microhei em plotting funções.
Outra opção é instalar as fontes de origem Han Sans/Serif localmente usando o seguinte código:
library( showtext )
font_install(source_han_serif())
font_families()
# # [1] "sans" "serif" "mono" "wqy-microhei"
# # [5] "source-han-serif-cn" Veja ?font_install e ?source_han para obter mais detalhes.
Every graphics device in R implements some functions to draw specific graphical elements, eg, path() and polygon() to draw polygons, raster() to display bitmap images, text() or textUTF8() to show text, etc. What showtext does is to override their own text rendering functions and replace them by hooks provided in showtext that will further call the device's path() or raster() functions to draw the character glifos.
Esta ação é feita apenas quando você chama showtext_begin() e não modificará o dispositivo gráfico se você chamar showtext_end() para restaurar as funções originais do dispositivo.
A partir da versão 0.9, o showText pode funcionar bem com o dispositivo gráfico RStudio (RStudiogd). Basta ligar para showtext_auto() na sessão rstudio e, em seguida, as parcelas serão exibidas corretamente.