python matplotlibからベクタ形式画像ファイルの出力

Python matplotlibで描画した画像のベクタ形式での画像出力に少し手間取ったので,方法をメモしておきます.

 

(1)通常のpngファイル出力

通常のPNGファイルであれば,出力先ファイルの拡張子をpngにしておけば

plt.savefig()で勝手にPNGで出力してくれます.

 

import matplotlib.pyplot as plt
plt.plot(x, y)
file = figure.png
plt.savefig(file)

(2)Windowsメタファイル(EMF)出力

plt.savefigが対応している出力形式にemfは含まれないため,拡張子をemfにしても出力されません.

plt.savefigが対応する画像形式のうち,svgというベクタ形式ファイルで出力すると,別途Inkscapeというソフトでsvg→emfに変換出来るようです.

Pythonから使いやすいように,inkscapeを呼び出すスクリプトを作成しておきます.

Inkscapeのインストール

Inkscape - Windows : 64-bit : msi | Inkscape

 inkscape.org

 

 上記リンクより,installer(exe)をダウンロードしてInkscapeをインストールします.

スクリプトの作成

以下の内容をテキストファイルに入力し,"svg2emf.cmd"という名前でパスの通った場所に保存しておきます.

内容としては,"inkscape.exe SVGファイルのフルパス名 -M 拡張子をemfに変えたフルパス名"をコマンドプロンプトで実行させるものになります.

@echo off
set inkscape="C:\Program Files\inkscape\inkscape.exe"
%inkscape% %1 -M %~dpn1.emf

pythonでの実行

import matplotlib.pyplot as plt
import os
plt.plot(x, y)
file = C:\Users\User\figure.svg
plt.savefig(file)
os.system("svg2emf "+file)

これでsvg出力した後emf変換まで出来るようになりました.

(3)PostScriptファイル(EPS)出力

通常,plt.savefigで拡張子をpsまたはepsにすると,PostScriptファイルを出力できます.

しかしながら,私の環境では以下のようなエラーが出て出力することができませんでした.

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 18-19: ordinal not in range(256)

恐らく図に利用している文字列等のエンコードエラーだと思うのですが,解決法がわかりませんでした.

どのみちPowerPoint等で作成したemf画像もepsに変換して利用しようと思っていたため,汎用的なemf→eps変換ソフトで対応することにしました.

どうやらMetafile to EPS Converterというソフトで変換できるようです.

①Metafile To EPS Converterのインストール

wiki.lyx.org

上記リンクからインストーラをダウンロードしインストールします.

スクリプトの作成

以下の内容を"emf2eps.cmd"という名前でパスの通った場所に保存します.

@echo off
set metafile2eps="C:\Program Files (x86)\Metafile to EPS Converter\metafile2eps.exe"
%metafile2eps% %1 %~dpn1.eps

pythonでの実行

svgファイルを出力してemfに変換した後,以下を実行すればepsが作成されます.

os.system("emf2eps "+os.path.splitext(file)[0]+".emf")

これでめでたくEPSファイルも作成できました.

 

参考:

Windows版 Inkscape の入手

matplotlibのグラフをemfファイル形式に変換

SVG ファイルを EMF ファイルに変換して PowerPoint に貼り付ける

Metafile to EPS Converter

Metafile to EPS Converter で Windows Metafile を EPS に変換

バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法