須通り
Sudo Masaaki official site
For the reinstatement of
population ecology.

ぼくとママンとディスカッション

     

ホーム | 統計 Top | Rにおける作図時のフォント設定を極める

Rのコンソールで使用するフォントは、Windowsであればメニューの「編集」「GUIプリファレンス...」から、MacOSでは環境設定の「エディタ」から設定できる。じゃあグラフを描く(描画デバイスを使用する)とき、そこで使うフォントを自由に指定したかったらどうする?今回はRのグラフィック関連パラメータから、フォントに関する項目を抜き出して説明する。極めれば君もナウなヤングにバカウケだ。

目次

  1. par(font): 太字・イタリック等の書体を指定する
  2. par(family): 作図に用いるフォントファミリーを指定する
  3. フォントファミリーって何なのさ

    par(family="○○") として直接フォント名を指定できるか?

    MacOS X のQuartz Deviceでフォントファミリーを指定する

    Windows のデバイスでフォントファミリーを指定する

    独自に定義されたフォントファミリーを含むグラフをWindowsでPDF保存する際の問題

  4. par(ps): フォントサイズを指定する

par(font): 太字・イタリック等の書体を指定する

Rのグラフィックパラメータに par(font) という項目がある。一見すると、このオプションでフォント名が自由に指定できるように思えるのだが、実際にはフォントの書体を選ぶためのパラメータである。

  • font=1 通常の立体
  • font=2 ボールド体
  • font=3 イタリック体(Italic)もしくは斜体(oblique)
  • font=4 ボールド体かつイタリック体
  • (場合によって)font=5 シンボルフォント
plot(1:10 ~ c(1:10), font=3 ) ##plot関数内のオプションとしてフォントをイタリックにした例

par(family): 作図に用いるフォントファミリーを指定する

par(font)が書体を指定するのであれば、フォントそのものは如何に指定するのか?こんなとき、Rで用いられるのが「フォントファミリー」だ。

フォントファミリーって何なのさ

フォントファミリーとは聞き慣れない概念であるが、ここでは「あるフォントにおける、立体や斜体、ボールド体などの書体をまとめた1セット」と解釈しておけば良いだろう。例えて云うならば、 "Helvetica" や "Times New Roman" などが「佐藤」や「鈴木」に類するファミリーの名前であり、その中にある "Bold" や "Italic" などの書体が「太郎」や「花子」や「侘び輔」といった家族の個人名に相当する。

このフォントファミリーを管理するのが、グラフィックパラメータ par の一種である、par(family) である。まずヘルプページにおけるpar(family)の説明、および須藤による日本語訳を下に掲載する。

family

    The name of a font family for drawing text. The maximum allowed length is 200 bytes. This name gets mapped by each graphics device to a device-specific font description. The default value is "" which means that the default device fonts will be used (and what those are should be listed on the help page for the device). Standard values are "serif", "sans" and "mono", and the Hershey font families are also available. (Different devices may define others, and some devices will ignore this setting completely.) This can be specified inline for text.
    
(日本語訳)テキスト描画に用いるフォントファミリーの名称。最大長は200バイト。この名称は各描画デバイスによって解釈され、描画デバイス特有のフォント指定が為される。デフォルト値は""で、このときデバイスのデフォルトフォントが使用される(そのフォントが何であるかはデバイスのヘルプページに一覧表示される)。標準の値は "serif"、"sans"および"mono"であり、他にHersheyフォントファミリーも使用可能である。(デバイスによってはそれ以外のフォントファミリーも指定可能であるし、また別のデバイスでは指定が完全に無視されることもある。)それぞれのテキストについてインラインで指定することもできる*。

*訳注:familyを引数の1つに取りうる別の作画関数、例えばplot内でfamily="○○"と書いてもよい、ということ。

って何がなんだか分からないゾ。そう、Rにおけるフォントファミリーの指定方法は描画デバイス依存であるため、非常に説明しにくいのだ。しかし利用者レベルで気になるのは、テキトーな作図関数内で (family="なんか適当なフォント名") というワンフレーズを挿むことにより、フォントを指定して描画できるのか?という点であろう。

par(family="○○") として直接フォント名を指定できるか?

結論から言うと描画デバイス(端的には使用しているOS)の種類に依存する。たとえば以下の操作は、MacOS Xでは有効だが、Windowsではエラーを吐く。

par(family="Zapfino") ##テキトーなフォント名を指定してみる
plot(1:10 ~ c(1:10) )
par(family="Hiragino Mincho Pro W6") ##日本語フォントでもok
plot(1:10 ~ c(1:10), xlab="これは日本語")
font zapfino

Fig. 1 | フォントファミリーに直接フォント名として"Zapfino"を指定した例。Macでのみ有効となる。

であれば、プラットフォームを問わずに有効な family="" の指定内容とは何か?それは「予め定義しておいたフォントファミリーの名称」である。

MacOS X のQuartz Deviceでフォントファミリーを指定する

最新の林檎でRを使っている人の場合、特段意識しなければplot()等の作画関数で開かれるグラフ窓は、Quartzという描画エンジンを用いて作成されるはずだ(残念ながら筆者はMacOS 9以前の世界を知らないため、クラシックOSでの使い方は質問されても答えられない)。ここで使われるフォントのセット(フォントファミリー)を定義する関数が、quartzFontである。

  • とりあえずヘルプを参照したいときは、 help(quartzFont) として探す。
  • quartzFonts() と打てば、現在のフォントファミリーとその構成内容の一覧を出力できる。
> quartzFonts()
$serif
[1] "Times New Roman"      "Times-Bold"      "Times-Italic"      "Times-BoldItalic"

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

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

初期状態では、上に示した"serif", "sans", "mono"という3つのフォントファミリーが定義されている。各ファミリーにはfont=1から4までに対応するフォント名が、文字列として格納されている。

## 以下のように打てば、グラフの文字をタイプライター風(モノスペースフォント)にできる
> plot(1:10 ~ c(1:10), family="mono")
  • 新しいフォントファミリーを定義することで、好みのフォントをグラフ中に使用できる。
  • 4つの書体に対応するフォントを、長さ4の文字型ベクトル形式で与える必要がある。
#####たとえば新たなフォントファミリーとして、Optimaを使いたい場合

>  quartzFonts( OPTIMA = c("Optima-Regular", "Optima-Bold", "Optima-Italic", "Optima-BoldItalic") ) ## "OPTIMAは新造するファミリーの名

> plot(1:10 ~ c(1:10), font=2, pch="f", family="OPTIMA", xlab="Label by Optima Bold")
font_optima

Fig. 2 | quartzFonts() を用いてフォントファミリーにOptima、書体に(2)Boldを定義した例。

さて問題となるのは、ここで指定するフォントの内部名称をどうやって知るかである。幸いなことにMacOS Xには "Font Book.app" が存在する。このアプリケーションを開いて、お望みのフォントの説明を表示させよう。一番上に出てくる「PostScript 名」の項目が、フォントファミリー定義に必要な名称である。

fontbook

Fig. 3 | Font Book.appにおけるフォントの説明例。

Windows のデバイスでフォントファミリーを指定する

こちらはwindowsFonts()という関数を使う。

  • とりあえずヘルプを参照したいときは、 help(windowsFonts) として探す。
  • windowsFonts() と打てば、現在のフォントファミリー名とその構成内容の一覧を出力できる。
> windowsFonts()
$serif
[1] "TT Times New Roman"

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

##MacOS XのquartzFontsとの違いとして、こちらはboldとかitalicとかの指定を直接行わない。なおTTはTrueTypeの略。

  • 新しいフォントファミリーを定義することで、好みのフォントをグラフ中に使用できる。
#####たとえば新たなフォントファミリーとして、メイリオを使いたい場合
>  windowsFonts(MEI = windowsFont("Meiryo")) ## "MEI"は新造するファミリーの名
> plot(1:10 ~ c(1:10), font=4, pch="f", family="MEI", xlab="これは日本語")
font zapfino

Fig. 4 | windowsFonts() を用いてフォントファミリーにメイリオを定義した例。

独自に定義されたフォントファミリーを含むグラフをWindowsでPDF保存する際の問題

Windows版のRで、上に示したグラフをPDF保存しようとすると、次のようなエラーが出て保存に失敗する(ラスター画像形式を選んだときは問題ない)。

エラー:  不正なフォントタイプです 
 追加情報:   警告メッセージ: 
1: font family 'MEI' not found in PostScript font database 

理由は単純で、windowsFonts() 内部で新たに定義したファミリーは、別の描画デバイスが司るところのPDF書き出しには、自動的に適用されないのである。

本エラーを回避する一つの方法は、RのPDF作成に用いられるモジュールに対しても windowsFonts のそれと同名、同内容のフォントファミリーを定義することだ。これにより、PDF作成モジュールがそのフォントファミリー指定を解釈できるようになる。この用途には postscriptFonts() という関数を使う。

もう一つは、 R内蔵のPDF出力機能を使用しないことである。この場合、メニューから「印刷...」として、 Adobe Distiller や Ghostscript などの仮想プリンタ機能を呼び出してやれば、PDFファイルへの変換が可能だ(変換ソフトは自分で用意する必要あり)。個人的にはこちらの解決策をお薦めする。

というのも、たとえ最終的にPDFを出力できたとしても、RはデフォルトではPDFにフォントを埋め込まないからである(埋め込みのためには別途 embedFonts などの手続きを経由する必要がある)。たとえば普段Rを使用しているのと異なるマシン環境へ、フォントの埋め込まれていないPDFファイルを移した場合、利用先で文字が表示されないという事故も起こり得る。もし相手が論文の査読者であったりすれば、あなたが心血を注いだ研究が陽の目を見ることは無いであろう。

par(ps): フォントサイズを指定する

ps = "数字" により、描画デバイス内で用いるフォントのサイズをポイント(1/72 inch)単位で指定できる。これは別段、難しい点はない。

### 現在のフォントサイズ設定を確認する
> par("ps")
[1] 12  

### フォントサイズを24ポイントに設定。
> par(ps=24)
> plot(1:10 ~ c(1:10))