Using CJK Fonts in R and ggplot2


ツイッターでggplot2で日本語使えるの?的な話があったので、昔書きかけた記事を中途半端に描き上げてみました。
結論から言うと使えるんですが、OSとかデバイスが何か、とかでいろいろ違うので、完全に理解するのは結構大変です。
あとRのグラフィックスはbaseベースとgridベースがあるんですが、入門書では絶対にbaseベースなので、gridベースになじめない、このあたりも誤解を招く原因になってるような気がする。描画の自由度はgridベースのほうが大きいです。お手軽なプロットならbaseだったんだけど、gridベースのグラフィックスパッケージが出てきてgridでもお手軽にできるようになりつつある、という現状なのかな。

おまじない

面倒な解説は不要、という人は以下の例で。

library(ggplot2)

d <- data.frame(x=1:2, y=1:2, t=c("あ","い"))

## PDFで出力する場合は簡単
p <- ggplot(d, aes(x, y, label=t)) + geom_text() + opts(title="う")
ggsave("out.pdf", p, family="Japan1GothicBBB")

## MacでQuartz(デフォルト)を使う場合
quartzFonts(HiraMaru=quartzFont(rep("HiraMaruProN-W4", 4)))
ggplot(d, aes(x, y, label=t)) + geom_text() + opts(title="う") + theme_grey(base_family="HiraMaru")
grid.gedit("GRID.text", grep=TRUE, global=TRUE, gp=gpar(fontfamily="HiraMaru"))

## Windowsでwindow(デフォルト)を使う場合
windowsFonts(Mei=windowsFont("Meiryo"))
ggplot(d, aes(x, y, label=t)) + geom_text() + opts(title="う") + theme_grey(base_family="Mei")
grid.gedit("GRID.text", grep=TRUE, global=TRUE, gp=gpar(fontfamily="Mei"))

windows環境とか試してないけど、多分イケルと思います。もしうまく行かなかったら教えてください。
latticeでは日本語どうなってるんだろう?

解説みたいな

プラットフォーム(OS)、出力デバイスによって方法が異なるので注意が必要です。自分が使えるデバイスを知るには、

> capabilities()
    jpeg      png     tiff    tcltk      X11     aqua http/ftp  sockets   libxml     fifo   cledit    iconv      NLS  profmem    cairo 
    TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE 

こんな感じ。Windowsだとcairoとかまだ使えないと思います。

1. Macの場合(Quartzとかpng/bmpとか)

目で見るだけならmacならQuartzを使いましょう。その後pngとかbmpとかのラスタグラフィックで保存するなら、ほっとけばquartzで書かれたのがそのままコピーされます。

Quartzでフォントの指定はquartzFonts()とquartzFont()を使います。

まず、quatrzFonts()で、すでに登録されてるフォントファミリーの一覧。

> quartzFonts()
$serif
[1] "Times-Roman"      "Times-Bold"       "Times-Italic"     "Times-BoldItalic"

$sans
[1] "Helvetica"             "Helvetica-Bold"        "Helvetica-Oblique"    
[4] "Helvetica-BoldOblique"

$mono
[1] "Courier"             "Courier-Bold"        "Courier-Oblique"    
[4] "Courier-BoldOblique"

serifとかsansとかがフォントファミリーの名前です。で、”Times-Roman”とかが実際のフォントの名前です。

日本語使いたいので新しいフォントファミリーを登録します。とりあえずヒラギノ丸ゴシックで。

> quartzFonts(HiraMaru=quartzFont(rep("HiraMaruProN-W4", 4)))
> quartzFonts()
$serif
[1] "Times-Roman"      "Times-Bold"       "Times-Italic"     "Times-BoldItalic"

$sans
[1] "Helvetica"             "Helvetica-Bold"        "Helvetica-Oblique"    
[4] "Helvetica-BoldOblique"

$mono
[1] "Courier"             "Courier-Bold"        "Courier-Oblique"    
[4] "Courier-BoldOblique"

$HiraMaru
[1] "HiraMaruProN-W4" "HiraMaruProN-W4" "HiraMaruProN-W4" "HiraMaruProN-W4"

それぞれのフォントファミリーに4つのフォントを登録してますが、これはフォントフェイスで、通常、太字、斜体、太字斜体用です。

で、ggplot2(0.8.9)での使い方ですが、タイトルとか軸ラベルとか、凡例とかのフォントはテーマで指定できます。

qplot(1:2, 1:2) + opts(title="日本語です。", plot.title=theme_text(family="HiraMaru"))

だけどgeom_textのフォントはテーマで指定できません。quartzだと結構面倒です。多分一回描画してから無理やり変更するのが一番楽。

qplot(1:2, 1:2, label=c("日本語", "日本語"))
grid.gedit("GRID.text", grep=TRUE, global=TRUE, gp=gpar(fontfamily="HiraMaru"))

2. Windowsの場合(windowとかpng/bmpとか)

仕組みはMacのQuatrzと一緒です。Quartzの部分をWindowsに変えて、windowFontの指定の仕方を正しくすれば大丈夫なはず。冒頭の例を参考に。

?windowsFonts とか ?windowsFont とかしてみてください。

3. PDFの場合

PDFの場合、フォントの細かい指定はかなり面倒かつ、TrueType/OpenTypeフォントを使うのがかなり面倒なので、冒頭の例みたいに、ggplot2の中ではフォントを指定しないで、PDF作成時のfontfamilyにJapan1とか、Japan1GothicBBBとかするのが楽です。
気合い入れれば好きなフォント使えますが、これはまたそのうち。

最後手抜きですいません。気が向いたら追記します。
けど、これ参考にいろいろ試してもらえば、Rでのbase/gridのグラフィック描画の仕組みがちょっと分かってもらえると思います。

One thought on “Using CJK Fonts in R and ggplot2

  1. Pingback: How to get a data frame from html pages directly in R | ЯтомизоnoR

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s