Matplotlibを使用して表示する代わりに、プロットを画像ファイルに保存します


1150

オンザフライでプロットを生成するための簡単で汚いスクリプトを書いています。以下のコード(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)に保存して、バッチスクリプトで使用できるようにします。それ、どうやったら出来るの?


85
私が答えを見つけたように見えます:そのpylab.savefig( 'foo.png')
Homunculus Reticulli

2
リンクは多分matplotlib.orgのどこかにリンクするべきですか?
A.Wan

40
また、pylabを使用しない場合、figureオブジェクトにもsavefigメソッドがあります。だからあなたはfig = plt.figure()それから電話をかけることができますfig.savefig(...)
A.Wan

27
回答の多くはページの言及plt.close(fig)を引き下げ、大きなループでは特に重要です。そうでない場合、数字は開いたままでメモリで待機し、実行時に開いているすべての数字が表示されますplt.show()
timctran

注意:matplotlib.pyplotが好ましい: stackoverflow.com/questions/11469336/...
ErichBSchulz

回答:


1440

質問には答えましたが、matplotlib.pyplot.savefigを使用するときに役立つヒントをいくつか追加したいと思います。ファイル形式は、拡張子で指定できます。

from matplotlib import pyplot as plt

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

ラスタライズされた出力またはベクトル化された出力をそれぞれ提供しますが、どちらも便利です。さらにpylab、画像の周囲に十分な、多くの場合望ましくない余白が残ることがわかります。それを削除します:

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

9
結果の画像の寸法を変更することは可能ですか?
Llamageddon 2013年

43
@Asmageddon plt.savefigあなたはdpiを変更することができます、答えのリンクを見てください。寸法は、図を作成するときに、参照制御することが可能figsizematplotlib.org/api/figure_api.html#matplotlib.figure.Figure
夢中

5
@MoTSCHIGGEを呼び出すplt.ioff()と、matplotlib.pyplotコマンドの対話性が無効になります。
rubenvb

5
@STMohammed foo.png パスです。たとえば、次のようなディレクトリに置くことができますsavefig("mydir/foo.png")ます。
フック

3
bbox_inches = 'tight'は魅力のように機能します。あなたは私の日を作った
Catbuilts

205

他の人が言ったように、plt.savefig()またはfig1.savefig()実際に画像を保存する方法です。

ただし、場合によっては は図が常に表示。(たとえば、Spyderでplt.ion():対話モード=オンになっています。)私は巨大ループのFigureウィンドウを強制的に閉じることでこれを回避しますplt.close(figure_object)ドキュメントを参照)。したがって、ループ中に100万の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 window

必要に応じて、後で図を再度開くことができるはずですfig.show()(自分でテストしませんでした)。


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

2
Jupyterノートブックでも同じ問題が発生します。plt.close(fig)解決しました
intsco


89

ちょうどこの問題に対処するMatPlotLibのドキュメントでこのリンクを見つけました:http ://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

彼らは、図がポップアップするのを防ぐ最も簡単な方法は、非インタラクティブなバックエンド(Aggなど)を使用することであると言っています。 matplotib.use(<backend>)、例えば:

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

私はまだ個人的にを使用することを好みplt.close( fig )ます。それ以降は、特定の図を(ループ中に)非表示にするオプションがありますが、ループ後のデータ処理のために図を表示します。ただし、非インタラクティブなバックエンドを選択するよりも遅くなる可能性があります。誰かがそれをテストした場合は興味深いでしょう。

更新:Spyderの場合、通常、この方法でバックエンドを設定することはできません(Spyderは通常、matplotlibを早期にロードするため、使用できません。matplotlib.use())。

代わりに、を使用するplt.switch_backend('Agg')か、オフにします "、Spyder設定で「サポートを有効にする」を、matplotlib.use('Agg')コマンドを自分でください。

これら2つのヒントから:1つ2つ


1
これは、セットディスプレイがない状況で非常にうまく機能します。が正しく設定されていない.plot()場合に別のバックエンドを使用すると、エラーがスローos.environ['DISPLAY']されます。
経済

1
ありがとう。これは機能し、インターネット接続がなく、システム管理者がパッケージをインストールする必要がある本番サーバーに非常に役立ちます。
Leon、

:matplotlibのサイトが「バックエンド」の説明/定義のために持っているチュートリアルのようなI matplotlib.org/tutorials/introductory/...
タナーStrunk

47

「現在」の図の概念が気に入らない場合は、次のようにします。

import matplotlib.image as mpimg

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

2
これは単にコピーしませんsrc.pngout.png
gerrit

これは単なる例であり、画像オブジェクト(img)がある場合は、.imsave()メソッドを使用してファイルに保存できます。
wonder.mice

4
@ wonder.miceは、現在の図を使用せずに画像を作成する方法を示すのに役立ちます。
16

@ wonder.miceこの例のおかげで、画像オブジェクトを.pngに保存する方法を示した最初の例です。
アーサーデント

@scry常に画像を作成する必要はありません。コードを試して視覚的な出力が必要な場合があります。このような場合に便利です。
シュッツェ

29

他の答えは正しいです。しかし、後でFigure オブジェクトを開きたい場合があります。たとえば、ラベルのサイズを変更したり、グリッドを追加したり、その他の処理を実行したい場合があります。完璧な世界では、プロットを生成するコードを再実行し、設定を調整します。悲しいかな、世界は完璧ではありません。したがって、PDFまたはPNGへの保存に加えて、以下を追加します。

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

このように、後でFigureオブジェクトを読み込んで設定を自由に操作できます。

また、スタックをソースコードで書き出し、 locals()各関数/メソッド辞書を使用ので、後で図を生成したものを正確に知ることができます。

注意:この方法では時々巨大なファイルが生成されるので注意してください。


数字をインラインにして、jupyterノートブックで開発を行うのは簡単ではないでしょうか?このようにして、履歴を正確に追跡し、再実行することもできます。
CiprianTomoiagă2017

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

28
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()

28

plot()およびその他の関数を使用して必要なコンテンツを作成した後、次のような句を使用して、画面へのプロットとファイルへのプロットのどちらかを選択できます。

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4, 5))       # size in inches
# 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()

一部のfig = plt.figure(figuresize=4, 5)fig = plt.figure(figsize=(4, 5)) #figure sizes in inches
ユーザー

24

私は以下を使用しました:

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()

Figureを保存した後、plt.showを使用することが非常に重要であるとわかりました。そうしないと機能しません。PNGでエクスポートされた図


2
申し訳ありませんが、これのfは?プロットされた画像ファイル?f= plt.savefig('data.png')
モールス

14

次のいずれかを実行できます。

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

GUIプロットを閉じる前に、savefigを終了することを忘れないでください。これにより、事前に画像を確認できます。

または、plt.show() GUIを閉じてスクリプトを再度実行しますが、今回plt.show()plt.savefig()

別の方法として、

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

2
予期しないキーワード引数 'hold'を
受け取りました

13

私のように、Spyder IDEを使用している場合は、次のコマンドでインタラクティブモードを無効にする必要があります。

plt.ioff()

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

再度有効にする場合は、次を使用します。

plt.ion()


12

ソリューション :

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


9

質問によると、Matplotlib(pyplot)savefigは空白の画像を出力します

1つ注意する必要がplt.showあります。plt.savefig、または空白の画像が表示されます。

詳細な例:

import numpy as np
import matplotlib.pyplot as plt


def draw_result(lst_iter, lst_loss, lst_acc, title):
    plt.plot(lst_iter, lst_loss, '-b', label='loss')
    plt.plot(lst_iter, lst_acc, '-r', label='accuracy')

    plt.xlabel("n iteration")
    plt.legend(loc='upper left')
    plt.title(title)
    plt.savefig(title+".png")  # should before plt.show method

    plt.show()


def test_draw():
    lst_iter = range(100)
    lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
    # lst_loss = np.random.randn(1, 100).reshape((100, ))
    lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
    # lst_acc = np.random.randn(1, 100).reshape((100, ))
    draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")


if __name__ == '__main__':
    test_draw()

ここに画像の説明を入力してください


6
import matplotlib.pyplot as plt
plt.savefig("image.png")

Jupyter Notebook では、1つのセルの残りのplt-codeとともに、を削除plt.show()して追加する必要がありますplt.savefig()。画像は引き続きノートブックに表示されます。


1
"remove plt.show()" ..これは私の日を救いました...
グル

4

今日(この質問が行われたときには利用できませんでした)多くの人々がJupyter Notebookをpythonコンソールとして使用していることを考えると、プロットをとして保存するには、Jupyter Notebookからのクラスを.png呼び出して、図をインラインでプロットするだけです'セルをjupyterし、その図/画像をローカルディレクトリにドラッグします。最初の行を忘れないでください !matplotlibpylab%matplotlib inline


1
良いアイデア、イメージはノートブックに埋め込まれて残っている場合のファイルサイズに影響をメモを取るだけの必要性..だこと
prusswan

3

上記に加え__file__て、画像とPythonファイルが同じ名前になるように名前を追加しました。また、見栄えをよくするためにいくつかの引数を追加しました。

# Saves a PNG file of the current graph to the folder and updates it every time
# (nameOfimage, dpi=(sizeOfimage),Keeps_Labels_From_Disappearing)
plt.savefig(__file__+".png",dpi=(250), bbox_inches='tight')
# Hard coded name: './test.png'

2

を使用する場合matplotlib.pyplot、最初にプロットを保存してから、次の2行を使用してプロットを閉じる必要があります。

fig.savefig('plot.png') # save the plot, place the path you want to save the figure in quotation
plt.close(fig) # close the figure window

1

前に提案したように、次のいずれかを使用できます。

import matplotlib.pyplot as plt
plt.savefig("myfig.png")

表示しているIPhython画像を保存します。または別のメモ(別の角度から見て)で、open cvで作業する場合、またはopen cvをインポートした場合は、次のようにできます。

cv2をインポート

cv2.imwrite( "myfig.png"、image)

しかし、これはOpen CVで作業する必要がある場合に備えています。それ以外の場合は、plt.savefig()で十分です。


0

画像は任意の拡張子(png、jpgなど)で、必要な解像度で保存できます。これは、フィギュアを保存する関数です。

import os

def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
    path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
    print("Saving figure", fig_id)
    if tight_layout:
        plt.tight_layout()
    plt.savefig(path, format=fig_extension, dpi=resolution)

'fig_id'は、Figureを保存する名前です。それが役に立てば幸い:)


0

あなたはこのようにそれを行うことができます:

def plotAFig():
  plt.figure()
  plt.plot(x,y,'b-')
  plt.savefig("figurename.png")
  plt.close()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.