ShowTextを使用すると、Rプロットでさまざまなタイプのフォント(TrueType、Opentype、Type 1、Type 1、Webフォントなど)を簡単に使用できます。このパッケージを開発する動機は、Rプロット(特にPDFデバイスの場合)で非標準フォントを使用することは、たとえば漢字でPDFを作成する場合、簡単ではないことです。これは、 pdf()で使用される標準フォントのほとんどに漢字グリフが含まれていないため、ユーザーはRでシステムフォントをほとんど使用できないためです。
Winston Changによって開発されたExtraFontパッケージは、この問題に対する素晴らしい解決策の1つであり、主にPDFグラフィックスデバイスでTrueTypeフォント( .ttf )の使用に焦点を当てています。これで、 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フォントを介してオンラインで利用できるいくつかのフォントをロードし、 showtext_auto()関数を呼び出すことにより、 showtextを使用してテキストをレンダリングするようにrに指示します。残りの部分はすべて、通常のプロットコマンドとまったく同じです。
この例は、 pdf() 、 png() 、 postscript() 、Linux上のwindows()やx11()などの画面上のデバイスを含むほとんどのグラフィックデバイスで動作するはずです。
まず、 pdf()どのように機能するかを少し説明させてください。
私の最善の知る限り、RのデフォルトのPDFデバイスはテキストを「描画」するのではなく、実際にはPDFファイルのテキストを記述します。つまり、実際のグリフの線や曲線を描く代わりに、テキストに関する情報、たとえば使用するキャラクター、使用するフォントなどのみが埋め込まれています。
ただし、宣言されたフォントを備えたテキストは、異なるOSで異なる方法で表示される場合があります。つまり、 pdf()によって作成されたグラフの外観はシステムに依存します。残念ながら、システムに宣言されたフォントがない場合は、テキストを正しく表示できない場合があります。
それに比べて、 ShowTextパッケージは、テキストを色で充填したポリゴナルのアウトライン(ベクトルグラフィックス用)またはラスター画像(ビットマップおよび画面上のグラフィックス用)に変換することにより、この問題を解決しようとします。このグラフを表示する人は、グラフを作成するフォントをインストールする必要はありません。グラフメーカーとグラフビューアの両方に便利なものを提供します。
さらに重要なことに、 ShowTextはシステムフォントファイルを使用できるため、Freetypeでサポートされている限り、お気に入りのフォントフェイスでグラフにテキストを表示できます。以下のフォントの読み込みセクションを参照してください。
指定されたフォントを使用してグラフを作成するには、次のことを行うだけです。
(*)でマークされたステップのみが新しいです。 ShowTextをグローバルに使用したい場合は、fructs showtext_auto() 1回呼び出し、その後のすべてのデバイスは、最初の例のようにShowTextを自動的に使用してテキストを自動的に使用します。
コードのどの部分がshowtextを使用するかをより細かい制御したい場合は、functions 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()ロードフォントは、実際にはパッケージSysfontsによって行われます。
フォントを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 )他のOSの場合、 simhei.ttfフォントファイルを持っていない場合がありますが、他の何かを使用するのに困難はありません。現在、 font_add() TrueTypeフォント(*。ttf/*。ttc)とopentype fonts(*。otf)をサポートしており、Freetypeがサポートする限り、新しいフォントタイプを追加することは些細なことです。
また、Webで利用可能でアクセス可能な多くの無料のフォントがあります。たとえば、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(中国語、日本、韓国語)フォントWenquanyi Micro HEIが含まれています。グラフにCJKテキストを表示するだけの場合は、プロット機能にwqy-microheiの姓を指定するだけです。
別のオプションは、次のコードを使用して、ソース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()を表示してテキストを表示します。 showtextが行うことは、独自のテキストレンダリング関数をオーバーライドし、それらをraster() path()たフックで提供されたフックに置き換えることです。グリフ。
このアクションは、 showtext_begin()を呼び出した場合にのみ実行され、 showtext_end()を呼び出して元のデバイス機能を復元する場合にグラフィックスデバイスを変更しません。
バージョン0.9から始めて、 ShowTextはRSTUDIOグラフィックスデバイス(RSTUDIOGD)でうまく機能します。 rstudioセッションでshowtext_auto()を呼び出すだけで、プロットが正しく表示されます。