2012-03-08 16 views
645

私は即座にプロットを生成するためのクイックダーティスクリプトを作成しています。私は出発点として(Matplotlibドキュメントから)以下のコードを使用しています:Matplotlibを使用してプロットを表示するのではなく、プロットを画像ファイルに保存します

from pylab import figure, axes, pie, title, show 

# Make a square figure and axes 
figure(1, figsize=(6, 6)) 
ax = axes([0.1, 0.1, 0.8, 0.8]) 

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' 
fracs = [15, 30, 45, 10] 

explode = (0, 0.05, 0, 0) 
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True) 
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5}) 

show() # Actually, don't show, just save to foo.png 

私は、ファイルにプロットを保存したい、ではなく、GUI上のプロットを表示したくない(たとえばFOO .png)ので、たとえば、バッチスクリプトで使用できます。それ、どうやったら出来るの?

+69

を使用することができますが見える:そのpylab.savefig( 'foo.png') –

+1

リンクは多分matplotlib.orgのどこかにリンクする必要がありますか? –

+20

また、ピラブを使用していない場合、figureオブジェクトには 'savefig'メソッドもあります。だからあなたは 'fig = plt.figure()'と 'fig.savefig(...)'を呼ぶことができます。 –

答えて

782

質問が回答されているが、私はsavefigを使用するときにいくつかの有用なヒントを追加したいと思います。ファイル形式は拡張子で指定することができます。

savefig('foo.png') 
savefig('foo.pdf') 

は、それぞれ有用であろうその両方をラスタライズされたか、ベクトル化出力が得られます。さらに、pylabは、イメージの周りの寛大な、しばしば望ましくない空白を残すことがわかります。それを削除します。あなたは「現在の」フィギュアの概念が気に入らない場合は、

savefig('foo.png', bbox_inches='tight') 
+1

結果の画像の寸法を変更することはできますか? – Llamageddon

+14

@Asmageddon 'plt.savefig'では、dpiを変更することができます。答えのリンクを参照してください。 Figureを作成するときにディメンションを制御できます。http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure – Hooked

+0

@Hooked pltの 'figsize'を参照してください。savefigは数字を保存しますが、それを表示することはできません。 plt.show()を省略しても、Figureが表示されます。どうすればそれを防ぐことができますか? – MoTSCHIGGE

114

ソリューションです:

pylab.savefig('foo.png') 
28

行います

は、 plt.savefig()または fig1.savefig()が実際に保存する方法他の人が言ったようです
import matplotlib.image as mpimg 

img = mpimg.imread("src.png") 
mpimg.imsave("out.png", img) 
+1

これは単に 'src.png'を' out.png'にコピーしませんか? – gerrit

+0

これは、画像オブジェクト( 'img')を持っているかどうかを示す単なる例です。次に、' .imsave() 'メソッドでファイルに保存できます。 –

+2

@ wonder.miceは、現在のFigureを使用せずにイメージを作成する方法を示すのに役立ちます。 – scry

90

画像。

しかし私は特定のケース(例えば、plt.ion():インタラクティブモード=オンのSpyderの場合)では常に数字が表示されていることがわかりました。私は私の巨大なループ内でFigureウィンドウの閉鎖を強制することでこの問題を回避、私はループの中に百万のオープン数字を持っていない:

import matplotlib.pyplot as plt 
fig, ax = plt.subplots(nrows=1, ncols=1) # create figure & 1 axis 
ax.plot([0,1,2], [10,20,3]) 
fig.savefig('path/to/save/image/to.png') # save the figure to file 
plt.close(fig) # close the figure 
+4

'plt.ioff()#interactive interactive plotting mode'を設定することもできますが、コードがエラーで終了した場合に使用したい動作を無効にする可能性があります。 – Demis

17
import datetime 
import numpy as np 
from matplotlib.backends.backend_pdf import PdfPages 
import matplotlib.pyplot as plt 

# Create the PdfPages object to which we will save the pages: 
# The with statement makes sure that the PdfPages object is closed properly at 
# the end of the block, even if an Exception occurs. 
with PdfPages('multipage_pdf.pdf') as pdf: 
    plt.figure(figsize=(3, 3)) 
    plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o') 
    plt.title('Page One') 
    pdf.savefig() # saves the current figure into a pdf page 
    plt.close() 

    plt.rc('text', usetex=True) 
    plt.figure(figsize=(8, 6)) 
    x = np.arange(0, 5, 0.1) 
    plt.plot(x, np.sin(x), 'b-') 
    plt.title('Page Two') 
    pdf.savefig() 
    plt.close() 

    plt.rc('text', usetex=False) 
    fig = plt.figure(figsize=(4, 5)) 
    plt.plot(x, x*x, 'ko') 
    plt.title('Page Three') 
    pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig 
    plt.close() 

    # We can also set the file's metadata via the PdfPages object: 
    d = pdf.infodict() 
    d['Title'] = 'Multipage PDF Example' 
    d['Author'] = u'Jouni K. Sepp\xe4nen' 
    d['Subject'] = 'How to create a multipage pdf file and set its metadata' 
    d['Keywords'] = 'PdfPages multipage keywords author title subject' 
    d['CreationDate'] = datetime.datetime(2009, 11, 13) 
    d['ModDate'] = datetime.datetime.today() 
9

私のように、あなたはスパイダーIDEを使用して、場合あなたがそれを有効にする場合

plt.ioff()

(このコマンドは自動的に科学的なスタートアップで起動される)

:、あなたが対話モードを無効にする必要があり再び、使用:

plt.ion()

46

はただ、まさにこの問題に対処matplotlibのドキュメントには、このリンクを見つけた: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

彼らはポップアップから姿を防ぐための最も簡単な方法は、非を使用することであると言います - 対話型バックエンド(例: matplotib.use(<backend>)経由AGG)、例えば:あなたはループの間に一定の数値を()隠し、まだポストループデータ処理のための数値を表示するオプションを持っているので

import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as plt 
plt.plot([1,2,3]) 
plt.savefig('myfig') 

は、私はまだ個人的に、plt.close(fig)を使用して好みます。非インタラクティブなバックエンドを選択するよりもおそらく遅いでしょう - 誰かがそれをテストしたら面白いでしょう。

8

ソリューション:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib 
matplotlib.style.use('ggplot') 
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 
ts = ts.cumsum() 
plt.figure() 
ts.plot() 
plt.savefig("foo.png", bbox_inches='tight') 

あなたは、画像だけでなく、画像の使用を節約を表示したいならば:

%matplotlib inline 

import matplotlib

13

た後、私は次のように使用:

import matplotlib.pyplot as plt 

p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)") 
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)") 
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05),  ncol=2, fancybox=True, shadow=True) 

plt.savefig('data.png') 
plt.show() 
f.close() 
plt.close() 

図を保存した後にplt.showを使用することが非常に重要であることが判明しました。そうでない場合は動作しません。 figure exported in png

19

他の回答は正しいです。しかし、私はときどき数字オブジェクトを開きたいと思うことがあります。たとえば、ラベルのサイズを変更したり、グリッドを追加したり、その他の処理を行うことができます。完璧な世界では、プロットを生成するコードを再実行し、設定を変更するだけです。悲しいかな、世界は完璧ではありません。そのため、PDFやPNGへの保存に加えて、私は追加します。このよう

with open('some_file.pkl', "wb") as fp: 
    pickle.dump(fig, fp, protocol=4) 

を、私は後でFigureオブジェクトをロードし、私は喜ばせるよう設定を操作することができます。

また、スタック内の関数/メソッドごとに、ソースコードとlocals()という辞書を書き出すので、後でその図の生成内容を正確に伝えることができます。

注意:この方法では巨大なファイルが生成されることがあるので注意してください。あなたがいずれかを実行することができます

import matplotlib.pyplot as plt 

fig = plt.figure(figuresize=4, 5) 
# use plot(), etc. to create your plot. 

# Pick one of the following lines to uncomment 
# save_file = None 
# save_file = os.path.join(your_directory, your_file_name) 

if save_file: 
    plt.savefig(save_file) 
    plt.close(fig) 
else: 
    plt.show() 
+0

数字のインラインで、ジュピターのノートブックで開発するのは簡単ではないでしょうか?この方法で、履歴を正確に追跡し、それを再実行することもできます。 –

+0

@CiprianTomoiagaインタラクティブなPythonシェル(Jupyterなど)からプロダクションプロットを生成することはありません。私はすべてのスクリプトからプロットします。 – gerrit

15

)して、必要なコンテンツを作成するために、他の機能、あなたが画面にプロットまたはファイルに間を選択するには、このような句を使用できます。

plt.show(hold=False) 
plt.savefig('name.pdf') 

そして、GUIプロットを閉じる前にsavefigを終了させるようにしてください。このようにして、あらかじめ画像を見ることができます。

代わりに、GUIを閉じて、もう一度スクリプトを実行しますが、今回はplt.savefig()plt.show()を置き換えるその後plt.show() でそれを見ることができます。私は答えを見つけたよう

また、あなたが

fig, ax = plt.figure(nrows=1, ncols=1) 
plt.plot(...) 
plt.show() 
fig.savefig('out.pdf') 
3

:(プロットを使用した後

+0

予期しないキーワード引数 'hold'が発生しました – amitdatta

関連する問題