2015/03/22

R 好きな日本語書体でグラフに書き込める showtext パッケージ

[R]
数式を PDF に埋め込む(2015/03/03)のに extrafont パッケージを使いました。これと他のパッケージを使って日本語を書き込む例は Qiita に既出で(Rでpdfに好きな日本語フォントを使用する)、今日は別の方法。OpenType や TTC(TrueType Collection)も含めてかなり自由に好きなフォントを使い、最初からアウトラインとして PDF に書き込めます。

文字情報は消えてしまい、ファイルサイズが増えるという短所もありますが、アウトライン化(拡大しても綺麗なベクタ図形化)なので閲覧環境による文字化けの心配がゼロ。フォント埋め込みの手間もなく、PDF を Illustrator などで開いても変化しません。showtext パッケージ一つで済むのも便利です。下はパッケージ開発者による紹介(使い方の説明あり)と CRAN のページ。

■ Yixuan's Blog : Using system fonts in R graphs
■ CRAN : showtext : Enable (any) R Graphics Device to Show Text Using System Fonts

上二つの表題に Using System Fonts とありますが、実はシステムにないフォントも使用可能。下が簡単なサンプル。実物の PDF(128 KB)も置いておきます。以下、実行環境は Windows 7 32bit + R 3.1.2 です。


↓ インストールは、普通にコンソールからコマンド一行を実行するだけ。同時に sysfonts という関連パッケージもインストールされます。

install.packages('showtext')


↓ パッケージをロードし、使うフォントを準備する例。システムフォントだけ使う場合は font.paths は不要です。システムにないフォントを使う場合は、適当な場所にまとめておいて font.paths でそのパスを指定すると便利。どちらの場合も font.add(任意のファミリ名, フォントファイル名) で指定します。

library(showtext)
font.paths('R:/') # システムフォルダ以外のフォントを使う場合
font.add('noto', 'NotoSansCJKjp-Regular.otf') # Noto
font.add('hana', 'HanaMinA.ttf') # 花園明朝
font.add('spop', 'HGRPP1.ttc') # 創英角ポップ


なお font.add で指定したファイルは、R のセッションが終わるまで移動できません。移動しようとすると ↓ こんな感じで止められます。


ともかく font.add が済めば準備完了です。後は、下のように text 関数を使う部分を showtext.begin() と showtext.end() で囲み、先ほど準備したファミリ名を text 関数の family 引数に渡すだけ。他のパラメータの使い方は普通と変わりません。

pdf('R:/20150322_0.pdf')
plot(type='n', x=1) # 空プロット

showtext.begin()
text(cex=3
, family='hana'
, label='好きな日本語書体で\nグラフに書き込み\n\n(花園明朝)'
, x=1, y=1)
showtext.end()

dev.off()


ここではフリーフォントの花園明朝を使用。下が出力結果で、実物の PDF も置いておきます。


パッケージには WenQuanYi Open Source Outline Fonts という日中韓の文字を含むオープンソースフォントが付属しており、パッケージロードと同時に使用準備が整います。フォントファミリ名は kaishu で、漢字の字形が日本語と微妙に違う点もありますが、味わいがあって良いです。下がサンプル。実物の PDF も置いておきます。

pdf('R:/20150322_k.pdf')
plot(type='n', x=1) # 空プロット

showtext.begin()
text(cex=3
, family='kaishu'
, label='フォント設定不要で\nパッケージ付属の書体を\nすぐ使えます\n\n(漢字は少し違う)'
, x=1, y=1)
showtext.end()

dev.off()


↓ 冒頭の PDF を出力したコード。一番上の書体は、上で述べた WenQuanYi Open Source Outline Fonts です。

text_sample = 'あのイーハトーヴォのすきとおった風\n夏でも底に冷たさをもつ青いそら'
font_family = c('kaishu', 'noto', 'hana', 'spop')
font_name = c('WenQuanYi Micro Hei', 'Noto Sans CJK JP Regular', '花園明朝', 'HG創英角ポップ体')
font_type = c('TTC', 'OTF', 'TTF', 'TTC')

pdf('R:/20150322_1.pdf', height=210/25.4, width=148/25.4)
par(mfrow=c(4,1), plt=c(5,98,13,97)/100)
for (i in 1:4) {
str = paste(sep='', text_sample, '\n\n', font_name[i], ' / ', font_type[i])
plot(type='n', x=1)
showtext.begin()
text(cex=2.5, family=font_family[i], label=str, x=1, y=1)
showtext.end()
}
graphics.off()


TTC の場合、コレクションの内どれが使われるのかは未検証。上の創英角ポップを見ると、コレクションの先頭?の等幅になっています。ともかく TTF、TTC、OTF どれでも使えるのは素晴らしく便利で、某マイナーフォント情報でつぶやかれている無名書体も試したくなります。

よく考えると、日本語フォントに限らず英数字でも好きなフォントが使えるはずで、実際 R help でのやりとり(help using extrafont package)にはその例がありました。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。