ShowText facilite l'utilisation de différents types de polices (trueType, OpenType, type 1, polices Web, etc.) dans R. La motivation à développer ce package est que l'utilisation de polices non standard dans des parcelles R (en particulier pour le dispositif PDF) n'est pas simple, par exemple, lors de la création de PDF avec des caractères chinois. En effet, la plupart des polices standard utilisées par pdf() ne contiennent pas de glyphes de caractère chinois, et les utilisateurs pourraient difficilement utiliser des polices système dans R.
Le package Extrafont développé par Winston Chang est une solution agréable à ce problème, qui se concentre principalement sur l'utilisation des polices TrueType ( .ttf ) dans le périphérique graphique PDF. Maintenant, ShowText est capable de prendre en charge plus de formats de police et plus de dispositifs graphiques, et évite d'utiliser des logiciels externes tels que 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 ) Dans cet exemple, nous chargeons d'abord certaines polices disponibles en ligne via Google Fonts, puis disons à R de rendre du texte en utilisant ShowText en appelant la fonction showtext_auto() . Toutes les parties restantes sont exactement les mêmes que les commandes de traçage habituelles.
Cet exemple devrait fonctionner sur la plupart des périphériques graphiques, y compris pdf() , png() , postscript() et les périphériques à l'écran tels que windows() sur Windows et x11() sur Linux.
Permettez-moi d'abord d'expliquer un peu comment fonctionne pdf() .
À ma meilleure connaissance, le périphérique PDF par défaut dans R ne "dessine" du texte, mais en fait "décrit" le texte dans le fichier PDF. C'est-à-dire que, au lieu de dessiner des lignes et des courbes du glyphe réel, il n'intègre que des informations sur le texte, par exemple les caractères qu'il dispose, quelle police il utilise, etc.
Cependant, le texte avec police déclaré peut être affiché différemment dans différents SG, ce qui signifie que l'apparition du graphique créé par pdf() dépend du système. Si vous n'avez malheureusement pas la police déclarée dans votre système, vous ne pourrez peut-être pas du tout voir le texte correctement.
En comparaison, le package ShowText essaie de résoudre ce problème en convertissant le texte en contours polygonaux remplis de couleurs (pour les graphiques vectoriels) ou des images raster (pour les graphiques bitmap et à l'écran), ayant ainsi la même apparence sous toutes les plates-formes. Les personnes qui voient ce graphique n'ont pas besoin d'installer la police qui crée le graphique. Il confère à la fois les fabricants de graphiques et les téléspectateurs de graphiques.
Plus important encore, ShowText peut utiliser des fichiers de police système, afin que vous puissiez afficher du texte dans le graphique avec votre face de police préférée, tant qu'elle est prise en charge par Freetype. Voir les polices de chargement de la section ci-dessous.
Pour créer un graphique à l'aide d'une police spécifiée, vous faites simplement ce qui suit:
Seules les étapes marquées (*) sont nouvelles. Si vous souhaitez utiliser ShowText globalement, vous pouvez appeler la fonction showtext_auto() une fois, puis tous les périphériques par la suite utiliseront automatiquement ShowText pour rendre le texte, comme le montre l'exemple du début.
Si vous souhaitez avoir un contrôle plus fin sur quelle partie du code doit utiliser ShowText , les fonctions showtext_begin() et showtext_end() vous aideront. Les fonctions de traçage uniquement entourées de cette paire d'appels utiliseront ShowText , et d'autres non. Par exemple, pour modifier la police de titre uniquement, nous pouvons faire:
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 police de chargement est réellement effectuée par Package Sysfonts .
Le moyen facile de charger la police dans ShowText est d'appeler font_add(family, regular) , où family est le nom que vous attribuez à cette police (afin que vous puissiez plus tard appeler par(family = ...) pour utiliser cette police en traçage), et regular est le chemin du fichier de police. C'est-à-dire que la connaissance du «nom de la police» ne suffit pas, car elles dépendent généralement du système. Au contraire, le fichier de police est l'entité qui fournit réellement les glyphes de caractère.
Habituellement, les fichiers de police sont situés dans certains répertoires "standard" du système (par exemple sur Windows, il s'agit généralement C:WindowsFonts ). Vous pouvez utiliser font_paths() pour vérifier le chemin de recherche actuel ou en ajouter un nouveau, et utiliser font_files() pour répertorier les fichiers de police disponibles dans le chemin de recherche. font_files() répertorie également d'autres informations utiles, par exemple le nom de famille que vous utilisez habituellement pour spécifier une police et la police pour différentes variantes. Vous trouverez ci-dessous un exemple pour montrer les résultats sur ma machine:
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-RegularEt le code ci-dessous montre comment charger et utiliser des polices système sur 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 ) Pour d'autres systèmes d'exploitation, vous n'avez peut-être pas le fichier de police simhei.ttf , mais il n'y a aucune difficulté à utiliser autre chose. À l'heure actuelle, font_add() prend en charge les polices TrueType (*. TTF / *. TTC) et les polices OpenType (*. OTF), et l'ajout d'un nouveau type de police est trivial tant que Freetype le prend en charge.
En outre, il existe de nombreuses polices gratuites disponibles et accessibles sur le Web, par exemple le projet Google Fonts (https://fonts.google.com/). Sysfonts fournit une interface pour télécharger et enregistrer automatiquement ces polices via la fonction font_add_google() , comme le montre l'exemple ci-dessous.
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 comprend une police CJK (chinois, japonaise et coréenne) Wenquanyi Micro Hei. Si vous souhaitez simplement afficher le texte CJK dans votre graphique, spécifiez simplement le nom de famille wqy-microhei dans le traçage des fonctions.
Une autre option consiste à installer les polices Han Sans / Serif Source localement à l'aide du code suivant:
library( showtext )
font_install(source_han_serif())
font_families()
# # [1] "sans" "serif" "mono" "wqy-microhei"
# # [5] "source-han-serif-cn" Voir ?font_install et ?source_han pour plus de détails.
Chaque appareil graphique en R implémente certaines fonctions pour dessiner des éléments graphiques spécifiques, par exemple, path() et polygon() pour dessiner des polygones, raster() pour afficher des images bitmap, text() ou textUTF8() pour montrer du texte, etc. Ce que showtext fait est de remplacer leurs propres fonctions de rendu de texte et de les remplacer par des crochets fournis dans la série qui appellera le path() ou des fonctions raster() pour dessiner la glyphe.
Cette action est effectuée uniquement lorsque vous appelez showtext_begin() et ne modifie pas le périphérique graphique si vous appelez showtext_end() pour restaurer les fonctions du périphérique d'origine.
À partir de la version 0.9, ShowText peut bien fonctionner avec le périphérique graphique RSTUDIO (RSTUDIOGD). Appelez simplement showtext_auto() dans la session RStudio, puis les tracés seront affichés correctement.