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
上記リンクより,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のインストール
上記リンクからインストーラをダウンロードしインストールします.
②スクリプトの作成
以下の内容を"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ファイルも作成できました.
参考:
SVG ファイルを EMF ファイルに変換して PowerPoint に貼り付ける
Metafile to EPS Converter で Windows Metafile を EPS に変換
バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法