Обычно можно набрать
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(1, 100, 500)
plt.hist(x)
plt.savefig(mypath) # or plt.show()
Однако, скажем, я хочу создать несколько графиков, и я не хочу сохранять ни один из них, пока не будут созданы все графики. Я попытался сделать следующее
import importlib
plots = [importlib.import_module('matplotlib.pyplot') for _ in range(5)]
for plot in plots:
plot.hist(np.random.randint(1,100, 500))
Но когда я бегу
plots[0].savefig(mypath) # or plots[0].show()
Я получаю что-то вроде этого:

Очевидно, что неважно, как я импортирую matplotlib.pyplot
, так как он всегда будет так себя вести.
Если я не хочу изменять изображения после их прочтения, я могу сделать следующее:
import io
import matplotlib.pyplot as plt
fig_files = [io.BytesIO() for _ in range(5)]
for f in fig_files:
plt.hist(np.random.randint(1, 100, 500))
plt.savefig(f) # save to BytesIO object
plt.gcf().clear() # clear out plot so subsequent ones don't overlap like above image
f.seek(0) # move to beginning of buffer so it can be read
for i, f in enumerate(fig_files):
with open('test_img_%d.png' % i, 'wb') as out:
out.write(f.read())
Это позволит мне сохранять графики в памяти, пока я не закончу с ними. Это хорошо, если я хочу избежать ненужных операций записи на диск, но при этом хочу сжать / упростить данные. Однако, если я хочу изменить различные аспекты графика (например, я хочу настроить шкалы после просмотра всех данных / мой заголовок / субтитры будут меняться в зависимости от общих результатов и т. Д.).
Есть ли способ сохранить состояние графика в памяти так, чтобы его можно было изменить позже, и затем записать на диск / отобразить?