RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (matplotlib.pyplot.figure) are retained until explicitly closed and may consume too much memory
課題
mpfで連続してfigureを出力したときメモリエラーが出る
解決法
下記の関数のようにreturn_plot=Trueにし,plt.clf()とplt.close()をこの順番で入れる
from mplfinance._mplwraps import Mpf_Figure def plot_candlestick_chart(self, head_number): # mpfでplt.close()を使うためには、Mpf_Figureを使う必要がある # https://qiita.com/tnozoo/items/776906392f9a4585c041 fig = plt.figure(FigureClass=Mpf_Figure) fig.mpfstyle = 'yahoo' fig, ax = mpf.plot( self.stock_data, # 使用するデータフレームを第一引数に指定 type='candle', # グラフ表示の種類を指定 ローソク足チャートであれば"candle" style='yahoo', # ここにスタイル一覧の中から好みのものを指定 例では"yahoo"を指定 # チャートのサイズの設定 figratio=(20, 10), # 図のサイズをタプルで指定 figscale=1.0, # 図の大きさの倍率を指定、デフォルトは1 tight_layout=True, # 図の端の余白を狭くして最適化するかどうかを指定 # 軸の設定 datetime_format='%Y/%m/%d', # X軸の日付の表示書式を指定 # xlim=('2021-01-01', '2021-02-01'), # X軸の日付の範囲をタプルで指定 指定無しならデータフレームを元に自動で設定される # ylim=(25000, 30000), # Y軸の範囲をタプルで指定 指定無しなら自動で設定される xrotation=45, # X軸の日付ラベルの回転角度を指定 デフォルトは45度 axisoff=False, # 軸を表示するかどうかを指定 デフォルトは"False" # データの表示設定 volume=False, # ボリュームを表示するかどうかを指定 デフォルトは"False" show_nontrading=False, # データがない日付を表示するかどうかを指定 デフォルトは"False" # ラベルの設定 # title=self.symbol, # チャートのタイトル ylabel='price', # チャートのY軸ラベル ylabel_lower='ylabel_lower', # ボリュームを表示する場合は、ボリュームのグラフのY軸ラベル # チャートの保存 savefig=f'../output/{experiment_id}/{head_number}_{self.start_date}_to_{self.end_date}_{self.symbol}_candle.png', returnfig=True, ) plt.clf() plt.close()
上記でもうまくいかず色々試した
色々やって警告は出るがプログラムは止まらなくなった.正直何が効いたかわからない
最初はノートブックで回していたが,スクリプト(.py)に変えてから調子が良くなった気も
plt.clfの後にplt.closeする順番は大事
plt.close('all’)もある
FigureManagerはオープン状態にして終わったらクローズするもの
mpfのオプションにreturnfig=Trueがある
class FigureManager: def __enter__(self): self.fig, self.ax = plt.subplots() return self.fig, self.ax def __exit__(self, exc_type, exc_val, exc_tb): # フィギュアが存在する場合に閉じる plt.close(self.fig) def plot_candlestick_chart(self, head_number): with FigureManager() as (fig, ax): mpf.plot( self.stock_data, # 使用するデータフレームを第一引数に指定 type='candle', # グラフ表示の種類を指定 ローソク足チャートであれば"candle" style='yahoo', # ここにスタイル一覧の中から好みのものを指定 例では"yahoo"を指定 # チャートのサイズの設定 figratio=(20, 10), # 図のサイズをタプルで指定 figscale=1.0, # 図の大きさの倍率を指定、デフォルトは1 tight_layout=True, # 図の端の余白を狭くして最適化するかどうかを指定 # 軸の設定 datetime_format='%Y/%m/%d', # X軸の日付の表示書式を指定 # xlim=('2021-01-01', '2021-02-01'), # X軸の日付の範囲をタプルで指定 指定無しならデータフレームを元に自動で設定される # ylim=(25000, 30000), # Y軸の範囲をタプルで指定 指定無しなら自動で設定される xrotation=45, # X軸の日付ラベルの回転角度を指定 デフォルトは45度 axisoff=False, # 軸を表示するかどうかを指定 デフォルトは"False" # データの表示設定 volume=False, # ボリュームを表示するかどうかを指定 デフォルトは"False" show_nontrading=False, # データがない日付を表示するかどうかを指定 デフォルトは"False" # ラベルの設定 # title=self.symbol, # チャートのタイトル ylabel='price', # チャートのY軸ラベル ylabel_lower='ylabel_lower', # ボリュームを表示する場合は、ボリュームのグラフのY軸ラベル # チャートの保存 savefig=f'../output/{experiment_id}/{head_number}_{self.start_date}_to_{self.end_date}_{self.symbol}_candle.png', returnfig=True, # https://github.com/matplotlib/mplfinance/issues/131 closefig=True, block=False, )
参考
https://qiita.com/tnozoo/items/776906392f9a4585c041
https://github.com/matplotlib/mplfinance/issues/131
ディスカッション
コメント一覧
まだ、コメントがありません