使用matplotlib畫圖時不能同時開啟太多張圖
阿新 • • 發佈:2018-12-06
使用matplotlib畫圖時有時會收到來自matplotlib的runtime warming的警告,原因可能是同時開啟太多張圖,最常見的情況是在一個迴圈中畫圖,每次迴圈都新建一個圖,但是未關閉新建的圖,當迴圈次數多了之後記憶體就吃不消了。
有兩種解決方法,一是隻建一個圖,每次迴圈結束後通過plt.cla()清除圖的內容,下次迴圈可以使用同一張圖作畫,例子如下:
import os import scipy import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from tqdm import tqdm data_path = r"D:\PycharmProjects\dataset" def load_mnist(): path = os.path.join(data_path, 'mnist') fd = open(os.path.join(path, 't10k-images-idx3-ubyte')) loaded = np.fromfile(file=fd, dtype=np.uint8) teX = loaded[16:].reshape((10000, 28, 28, 1)).astype(np.float) teX = teX / 255. return teX teX = load_mnist() fig, ax = plt.subplots(nrows=5, ncols=5, sharex='all', sharey='all') # 只建一張包含25個子圖的圖 ax = ax.flatten() for j in range(3): for i in range(25): img = teX[i + j * 25].reshape(28, 28) ax[i].imshow(img, cmap='Greys', interpolation='nearest') ax[0].set_xticks([]) ax[0].set_yticks([]) plt.tight_layout() # 自動緊湊佈局 plt.savefig(r"D:\test\%d.png" % j) plt.cla() # 清除內容
第二種方法是每次迴圈都新建一張圖,但是每次迴圈結束後關閉這張圖,例子如下:
import os import scipy import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from tqdm import tqdm data_path = r"D:\PycharmProjects\dataset" def load_mnist(): path = os.path.join(data_path, 'mnist') fd = open(os.path.join(path, 't10k-images-idx3-ubyte')) loaded = np.fromfile(file=fd, dtype=np.uint8) teX = loaded[16:].reshape((10000, 28, 28, 1)).astype(np.float) teX = teX / 255. return teX teX = load_mnist() # 獲取mnist的測試資料 for j in range(3): # 畫三張圖 fig, ax = plt.subplots(nrows=5, ncols=5, sharex='all', sharey='all') # 每次都新建一張包含25個子圖的圖 ax = ax.flatten() for i in range(25): img = teX[i + j * 25].reshape(28, 28) ax[i].imshow(img, cmap='Greys', interpolation='nearest') ax[0].set_xticks([]) ax[0].set_yticks([]) plt.tight_layout() # 自動緊湊佈局 plt.savefig(r"D:\test\%d.png" % j) plt.close()
實驗證明,用第二種方法會比第一種方法快很多