ShowText facilita el uso de varios tipos de fuentes (TrueType, OpenType, Tipo 1, fuentes web, etc.) en gráficos R. La motivación para desarrollar este paquete es que el uso de fuentes no estándar en las gráficas R (especialmente para el dispositivo PDF) no es sencillo, por ejemplo, al crear PDF con caracteres chinos. Esto se debe a que la mayoría de las fuentes estándar utilizadas por pdf() no contienen glifos de personajes chinos, y los usuarios difícilmente podrían usar fuentes del sistema en R.
El paquete ExtraFont desarrollado por Winston Chang es una buena solución para este problema, que se centra principalmente en usar FUENTS TRUETYPE ( .ttf ) en el dispositivo gráfico PDF. Ahora ShowText es capaz de admitir más formatos de fuentes y más dispositivos gráficos, y evita el uso de software externo como 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 ) En este ejemplo, primero cargamos algunas fuentes que están disponibles en línea a través de Google Fonts, y luego les decimos a R que represente el texto usando ShowText llamando a la función showtext_auto() . Toda la parte restante es exactamente la misma que los comandos de trazado habituales.
Este ejemplo debería funcionar en la mayoría de los dispositivos gráficos, incluidos los dispositivos pdf() , png() , postscript() y en pantalla como windows() en Windows y x11() en Linux.
Permítanme explicar primero un poco cómo funciona pdf() .
Hasta mi mejor conocimiento, el dispositivo PDF predeterminado en R no "dibuja" el texto, pero en realidad "describe" el texto en el archivo PDF. Es decir, en lugar de dibujar líneas y curvas del glifo real, solo incorpora información sobre el texto, por ejemplo, qué caracteres tiene, qué fuente usa, etc.
Sin embargo, el texto con fuente declarada se puede mostrar de manera diferente en un sistema operativo diferente, lo que significa que la aparición de gráfico creado por pdf() depende del sistema. Si desafortunadamente no tiene la fuente declarada en su sistema, es posible que no pueda ver el texto correctamente.
En comparación, el paquete ShowText intenta resolver este problema convirtiendo el texto en contornos poligonales llenos de color (para gráficos vectoriales) o imágenes ráster (para mapa de bits y gráficos en pantalla), con la misma apariencia en todas las plataformas. Las personas que ven este gráfico no necesitan instalar la fuente que crea el gráfico. Proporciona conveniencia tanto para los fabricantes de gráficos como para los espectadores de gráficos.
Más importante aún, ShowText puede usar archivos de fuentes del sistema, por lo que puede mostrar texto en el gráfico con su cara de fuente favorita, siempre que sea compatible con FreeType. Consulte la sección Carga de fuentes a continuación.
Para crear un gráfico usando una fuente especificada, simplemente haga lo siguiente:
Solo los pasos marcados con (*) son nuevos. Si desea usar ShowText a nivel mundial, puede llamar a la función showtext_auto() una vez, y luego todos los dispositivos después de eso usarán automáticamente ShowText para representar el texto, como muestra el ejemplo al principio.
Si desea tener un control más fino sobre qué parte del código debe usar showText , las funciones showtext_begin() y showtext_end() ayudará. Solo trazar funciones adjuntas por este par de llamadas utilizará ShowText , y otras no. Por ejemplo, para cambiar solo la fuente de título, podemos hacer:
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()La fuente de carga en realidad se realiza por el paquete SysFonts .
La forma fácil de cargar la fuente en showText es llamando font_add(family, regular) , donde family es el nombre que asigna a esa fuente (para que más tarde pueda llamar par(family = ...) para usar esta fuente en la trazado), y regular es el camino hacia el archivo de fuentes. Es decir, solo conocer el "nombre de fuente" no es suficiente, ya que generalmente dependen del sistema. Por el contrario, el archivo de fuentes es la entidad que en realidad proporciona los glifos de caracteres.
Por lo general, los archivos de fuentes se encuentran en algunos directorios "estándar" en el sistema (por ejemplo, en Windows, es típicamente C:WindowsFonts ). Puede usar font_paths() para verificar la ruta de búsqueda actual o agregar una nueva, y usar font_files() para enumerar los archivos de fuentes disponibles en la ruta de búsqueda. font_files() también enumera alguna otra información útil, por ejemplo, el apellido que generalmente usa para especificar una fuente y la cara de fuentes para diferentes variantes. A continuación se muestra un ejemplo para mostrar los resultados en mi 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-RegularY el siguiente código demuestra cómo cargar y usar fuentes del sistema en 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 otro sistema operativo, es posible que no tenga el archivo de fuentes simhei.ttf , pero no hay dificultad para usar algo más. En la actualidad, font_add() admite fuentes TrueType (*. TTF/*. TTC) y OpenType Fonts (*. OTF), y agregar un nuevo tipo de fuente es trivial siempre que el Tipo de FreeType lo admita.
Además, hay muchas fuentes gratuitas disponibles y accesibles en la web, por ejemplo, el proyecto Google Fonts (https://fonts.google.com/). SYSFONTS proporciona una interfaz para descargar automáticamente y registrar esas fuentes a través de la función font_add_google() , como muestra el siguiente ejemplo.
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 incluye una fuente de código abierto (chino, japonés y coreano) Wenquanyi Micro Hei. Si solo desea mostrar el texto CJK en su gráfico, simplemente especifique el apellido de wqy-microhei en la consignación de funciones.
Otra opción es instalar las fuentes de origen Han Sans/Serif localmente utilizando el siguiente código:
library( showtext )
font_install(source_han_serif())
font_families()
# # [1] "sans" "serif" "mono" "wqy-microhei"
# # [5] "source-han-serif-cn" Ver ?font_install y ?source_han para más detalles.
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 acción se realiza solo cuando llama showtext_begin() y no modificará el dispositivo gráfico si llama showtext_end() para restaurar las funciones originales del dispositivo.
A partir de la versión 0.9, ShowText puede funcionar bien con el dispositivo RSTUDIO Graphics (RSTUDIOGD). Simplemente llame showtext_auto() en la sesión rStudio y luego los gráficos se mostrarán correctamente.