拡大してもジャギーが出ないベクトルグラフィックの SVG形式 が Web では広く用いられるようになりました。かつては、R で SVG を出力するには、R 標準(cairo)の svg()
を使うか、RSVGTipsDevice パッケージの devSVGTips()
を使うという選択肢がありました。2015年末に Hadley Wickham が新しい svglite というパッケージを作りました(アナウンス、GitHubの hadley/svglite)。一方、RSVGTipsDevice は CRAN から消えてアーカイブ入りしてしまいました。また、ggplot2 では ggsave()
という関数で SVG を含むいろいろな形式で保存できるようになりました。
cairo 版では、文字も図形になり、ビューアに依存しないので安心ですが、日本語を使う場合は下の例のように日本語のフォント名を指定する必要があります。一方、svglite 版は文字は文字情報のまま入りますので、テキストエディタで文字列やフォント名を編集することができます。
比較のため、Mac で普通に画面に描いてスクリーンショットをとって PNG にしたものを最初に挙げておきます:
quartz(width=7, height=4) par(mgp=c(2, 0.8, 0)) curve(dnorm(x), xlim=c(-3, 3), main="正規分布")
表示サイズを揃えるため、CSS で img { width: 100% }
と指定してあります。
ファイルサイズは 32213 バイトです。
次に、標準(cairo)の svg()
を使って SVG 出力してみます(XQuartz のインストールが必要のはずです):
svg("dnorm-cairo.svg", family="Japan1GothicBBB", width=7, height=4) par(mgp=c(2, 0.8, 0)) curve(dnorm(x), xlim=c(-3, 3), main="正規分布") dev.off()
ファイルサイズは 29558 バイトです。
最後に、svglite の svglite()
を使ってみます。以前は日本語の文字幅がおかしくなって困りましたが、今は fix_text_size=FALSE
というオプションが指定できるようになりました:
library(svglite) svglite("dnorm-svglite.svg", width=7, height=4, fix_text_size=FALSE) par(mgp=c(2, 0.8, 0)) curve(dnorm(x), xlim=c(-3, 3), main="正規分布") dev.off()
ファイルサイズは 5652 バイトになりました。たいへんコンサイスなので、これがお薦めです。
フォントは Arial
になるようです。system_fonts=list(sans="Arial Unicode MS")
のようなオプションで変えられますが、システムに入っているフォントしか指定できないようです。必要なら sans-serif
などに一括置換してください。Arial
のままでも日本語が表示できるようです。
SVG は Web では最適ですが、論文など PDF で提出するものを LaTeX で作成する際には、図も PDF で用意することになるので、最初から PDF で出力するか、SVG を PDF に変換する必要があります。
SVG を PDF などに変換するには、GNOME プロジェクトの一環として開発された SVG ライブラリ librsvg が便利です。rsvg の頭の r は 開発者 Raph Levien の頭文字かと思ったら、"Resplendent SVG" の略だそうです(GNOME Wiki: Librsvg にそう書いてありますが、ほんとかな)。これを R から使えるようにしたのが rsvg パッケージです。これを使えば SVG 画像を PDF や任意解像度のビットマップ画像に変換できます。
前節の svglite 出力で試してみます:
library(rsvg) rsvg_png("dnorm-svglite.svg", "dnorm-svglite.png") # PNGに変換 rsvg_pdf("dnorm-svglite.svg", "dnorm-svglite.pdf") # PDFに変換
変換した PDF はちゃんとフォントが埋め込まれています:
% pdffonts dnorm-svglite.pdf name type encoding emb sub uni object ID ------------------------------------ ----------------- ---------------- --- --- --- --------- SDIIYF+ArialMT TrueType WinAnsi yes yes yes 6 0 NLDWWV+ArialMT TrueType WinAnsi yes yes yes 7 0 GJXHML+HiraginoSans-W6 CID Type 0C Identity-H yes yes yes 8 0
なお、Mac では brew install librsvg
、CentOS 7 では yum install librsvg2-tools
で入る rsvg-convert
コマンドを使えば、R を使わなくても SVG → PNG/PDF 変換ができます。ターミナルで例えば
rsvg-convert --format=pdf --output=hoge.pdf hoge.svg
のようにして使います。
Inkscape を使っても変換できます:
/Applications/Inkscape.app/Contents/MacOS/inkscape --export-filename=dnorm-svglite.pdf dnorm-svglite.svg
pdffonts
の出力:
name type encoding emb sub uni object ID ------------------------------------ ----------------- ---------------- --- --- --- --------- CCFHWU+ArialMT TrueType WinAnsi yes yes yes 13 0 SXQLMB+CairoFont-1-1 CID Type 0C Identity-H yes yes yes 14 0