matplotlibでグラフを表示しないで画像として保存する


1.背景

 第2回Neural Network Console Challengeへ参加させていただき、試行錯誤した内容を備忘録としてピックアップします。何回かに分けて投稿予定(あくまで予定)。初心者のプログラミングなので、面倒くさいことをやっている可能性大ですが、暖かい目で見守ってください。チャレンジ内容詳細は過去の投稿を参照ください。

2.コード

 ディープラーニングの学習データとして、音声データをメル周波数スペクトログラムの画像へ特徴量化する必要があり、librosaを使って変換しました。librosaには結果を表示する関数が用意されており"librosa.display.specshow"を使いmatplotlibで可視化するのが一般的かと思います。この時、いちいちグラフが表示されてしまい、すぐにメモリ不足の状態になります。plt.close()を使うとこれを簡単に回避できます。コードはざっくり下記。

plt.figure(figsize=(2, 1), dpi=100)
librosa.display.specshow(log_S, sr=sr) #librosaの結果表示
plt.subplots_adjust(left=0, right=1, bottom=0, top=1) #余白を調整
plt.savefig("fig.png")
plt.close() #←これ!

これをfor文で繰り返し保存してけばOK。Neural Network Console Challengeでは10,000点を超える音声データをグラフ(画像)データへ変換し保存しましたが、問題なしでした。