FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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のインストール
https://inkscape.org/ja/download/windows/より,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)

恐らく図に利用している文字列等のエンコードエラーだと思うのですが,解決法がわかりませんでした.
どのみちPPT等で作成したemf画像もepsに変換して利用しようと思っていたため,
汎用的なemf→eps変換ソフトで対応することにしました.
どうやらMetafile to EPS Converterというソフトで変換できるようです.

①Metafile To EPS Converterのインストール
http://wiki.lyx.org/Windows/MetafileToEPSConverterからインストーラをダウンロードし
インストールします.

②スクリプトの作成
以下の内容を"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 に変換
バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法
スポンサーサイト

コメント

さくら

突然の訪問、失礼いたします。
私はこちら⇒b--n.net
でブログをやっているさくらといいます。
色々なブログをみて勉強させていただいています。
もしよろしかったら相互リンクをお願いできないでしょうか?
「やってもいいよ」という方はコメントを返してくだされば、
私もリンクさせていただきます。
よろしくお願いします^^
非公開コメント

dededemio

某電機メーカーエンジニア。
真空管からプログラミングまでゆるゆると。

twitter

プロフィール

dededemio

Author:dededemio
某電機メーカーエンジニア。
真空管からプログラミングまでゆるゆると。

最新トラックバック

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。