SVG画像

はじめに

拡大してもジャギーが出ないベクトルグラフィックの 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% } と指定してあります。

Quartzグラフィックの例

ファイルサイズは 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()
CairoのSVGの例

ファイルサイズは 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()
svgliteのSVGの例

ファイルサイズは 5652 バイトになりました。たいへんコンサイスなので、これがお薦めです。

フォントは Arial になるようです。system_fonts=list(sans="Arial Unicode MS") のようなオプションで変えられますが、システムに入っているフォントしか指定できないようです。必要なら sans-serif などに一括置換してください。Arial のままでも日本語が表示できるようです。

rsvgによる変換

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