matplotlib
前回、出力結果をクリアする方法とmatplotlibのグラフ表示のクリアに関して解説をしました。
今回はmatplotlibの話題でplt.savefig()で真っ白なグラフが保存されてしまう場合の対処法に関して解説していきます。
それでは始めていきましょう。
plt.savefig()で真っ白なグラフが保存
まずは真っ白なグラフが保存されるプログラムを紹介します。
import random
import matplotlib.pyplot as plt
x = range(100)
y = [random.randrange(10) for _ in x]
def plot():
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.show()
def main():
plot()
plt.savefig('test1.png')
if __name__ == '__main__':
main()
このプログラムをJupyter Notebook上で実行すると、画面上ではちゃんとグラフが表示されます。
しかし保存される「test1.png」はこんな感じで真っ白なグラフとなります。
対処法
対処法は簡単で、「%matplotlib notebook」のマジックコマンドを追加するだけです。
import random
import matplotlib.pyplot as plt
%matplotlib notebook
x = range(100)
y = [random.randrange(10) for _ in x]
def plot():
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.show()
def main():
plot()
plt.savefig('test2.png')
if __name__ == '__main__':
main()
実行結果
ただ「%matplotlib inline」のマジックコマンドではこの真っ白なグラフが保存される問題は解消しませんでした。
どんな時に真っ白なグラフが保存されるのか
次に真っ白なグラフが表示される原因なのですが、これは「plt.show()」と「plt.savefig()」の位置関係にあります。
まずは「plt.savefig()」を先に、「plt.show()」を後に記述してみます。
import random
import matplotlib.pyplot as plt
x = range(100)
y = [random.randrange(10) for _ in x]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.savefig('test3.png')
plt.show()
実行結果
次に「plt.show()」を先に、「plt.savefig()」を後に記述してみます。
import random
import matplotlib.pyplot as plt
x = range(100)
y = [random.randrange(10) for _ in x]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.show()
plt.savefig('test4.png')
実行結果
「plt.savefig()」を先に、「plt.show()」を後にするとちゃんとグラフが表示され、「plt.show()」を先に、「plt.savefig()」を後にすると真っ白になってしまいました。
ということで「plt.savefig()」と「plt.show()」の位置関係が今回のグラフ真っ白問題の原因だと考えられます。
最後に真っ白なグラフとなった「plt.show()」を先に、「plt.savefig()」を後にしたプログラムに、マジックコマンド「%matplotlib notebook」を追加してみましょう。
import random
import matplotlib.pyplot as plt
%matplotlib notebook
x = range(100)
y = [random.randrange(10) for _ in x]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.show()
plt.savefig('test5.png')
実行結果
今度はグラフがちゃんと表示されました。
ということでmatplotlibでグラフ作成・保存をする場合は「%matplotlib notebook」のマジックコマンドを追加しておくことをおすすめします。
plt.show()、plt.savefig()の位置関係を注意すればいい?
「%matplotlib notebook」のマジックコマンドを追加しなくても、plt.show()、plt.savefig()の位置関係を注意すればいいじゃないかと思うかもしれませんが、実はそれができないケースが存在します。
私がこの問題に気づいたきっかけなのですが、ライブラリを使ってグラフを作成する場合、ライブラリ内で「plt.show()」が組み込まれてしまっている場合があります。
そしてライブラリ外で「plt.savefig()」を行うと真っ白になってしまったというわけです。
それを再現したのが、本記事の最初の方で紹介したプログラムで、関数の中に「plt.show()」が入っており、その外で「plt.savefig()」を実行するという状態です。
ライブラリ内に「plt.show()」が記述されており、グラフ保存のオプションがない場合、そのライブラリを使っている側としては手も足も出ません。
ということでmatplotlibを使ってグラフを表示、保存をする場合は「%matplotlib notebook」をつけておくのが無難かなと思います。
次回はmatplotlibで二つのグラフの間を塗りつぶす「fill_between」を紹介します。
ではでは今回はこんな感じで。
コメント