はじめに
共同研究などで先方からデータ解析を頼まれた場合に、画像やチャートのデータは色やフォントなどを変えられるよう、なるべくベクター画像形式で送ることにしています。
例えばRで出力するチャートは主にEPSで出力し、自分の作ったプログラムで図を出力する場合は大体SVG(なにせ作りやすい!)で出力していたりします。
ところが、図表作成はPowerPoint一択という流儀の人も結構いて、それだとEPSやSVGは逆に扱いづらく、WMF/EMFの方が良いというケースが多々あります。
しかし、一応RはWMF/EMFの出力も可能ですが、必ずしも世のプログラムが全てWMF/EMFの出力に対応しているわけではありません。
そんなわけで、PowerPointで使えるようにデータが欲しいと言ってきた人には、まとめてEMFに変換してスライドファイル(.pptx)に貼り付けて送っています。
変換のときにLinux上でInkscapeを利用しているのですが、最近その方法を教えてほしいと言われ、ついでにベクター画像の変換コマンドをまとめてGoogle Colabのノートとしてこちらにアップしたので、ここで紹介します。
Inkscapeとは
知らない人のために簡単な紹介をしておきます。筆者がまだ大学院生だった頃、後輩に無料のIllustratorと説明していました。多少の語弊はありますが、簡易説明としては概ね間違っていないと思います。
もう少しちゃんと言うと、Adobe Illustratorみたいな直感的に分かりやすい操作性でデザインやイラスト作成などの作業を出来る無料のソフトです。今回はGUIを使用しませんが、最近は色々な機能が追加されて...いることでしょう、きっと(←普段コマンドラインでしか使ってない)。
実際の変換方法
本題である変換についてです。
まずInkscapeをインストールします。ColabはUbuntuベースなのでaptのコマンドを下に載せていますが、他のディストリビューションでも、基本的にインストールパッケージが用意されています。
sudo apt-get install -y inkscape
あとは、変換したい形式に応じて下記に挙げたInkscapeのコマンドを実行するだけです。
変換元の形式は AI (人工知能ではなくAdobe Illustratorのやつ), EPS, PDF, SVG などに対応しています。あと、英語(内容含めて半角英数字のみ)での使用が前提です。
#最近のInkscape (> ver. 1.0)
inkscape --export-filename=<出力するファイルパス(.wmf)> <元画像のパス>
#過去のInkscape
inkscape --without-gui --export-wmf=<出力するファイルパス(.wmf)> <元画像のパス>
#最近のInkscape (> ver. 1.0)
inkscape --export-filename=<出力するファイルパス(.emf)> <元画像のパス>
#過去のInkscape
inkscape --without-gui --export-emf=<出力するファイルパス(.emf)> <元画像のパス>
ついでに
#最近のInkscape (> ver. 1.0)
inkscape --export-filename=<出力するファイルパス(.pdf)> <元画像のパス>
#過去のInkscape
inkscape --without-gui --export-pdf=<出力するファイルパス(.emf)> <元画像のパス>
#最近のInkscape (> ver. 1.0)
inkscape --export-text-to-path --export-filename=<出力するファイルパス(.eps)> <元画像のパス>
#過去のInkscape
inkscape --without-gui --export-ps-level=3 --export-text-to-path --export-eps=<出力するファイルパス(.eps)> <元画像のパス>
#新旧共通
inkscape --export-plain-svg=<出力するファイルパス(.svg)> <元画像のパス>
実は最近のInkscapeを使えば、出力ファイル名の拡張子を変えるだけで、自動でその拡張子に合わせたフォーマットへ変換されます。
もし古いバージョンのInkscapeを使う場合は、下段のコマンドで動くと思います(割と最近まで筆者は古いバージョンを使ってました)。
EPSへの変換については、UTF-8エンコードの半角英数字ですら文字化けすることがあるので、文字をパス化するオプションが余分についています。
ラスター画像 => ベクター画像への変換と違って、ベクター画像 => ラスター画像へ変換出来るプログラムは多いので、あえてInkscapeを使う必要もないと思いますが、一応ラスター化も出来ます。
# 背景色を白にしたい場合
inkscape --export-background=white --export-filename=<出力するファイルパス(.png)> <元画像のパス>
# 背景色を透明にしたい場合
inkscape --export-background=white --export-background-opacity=0.0 --export-filename=<出力するファイルパス(.png)> <元画像のパス>
# 過去のInkscape
## '--export-filename'を'--export-png'に置き換える
最後に
最初に書いたようにColabのノートブックにまとめて公開しています。
上のコードはローカルでも動いていますが、環境によってInkscapeのインストールが上手くいかない、実行するとエラーが出るetc...といったトラブルが起きるようなら、Colabの方にちょいと元画像をアップして変換してからダウンロードし直した方が早いかもです。
なんならRから動かせますし、python-pptxを使っている人はPowerPointファイルでの出力まで自動化出来ますしね。
参考
Inkscapeのコマンドラインオプションの簡易説明wiki