Сохранение и загрузка объекта matplotlib.pyplot
Я работаю в псевдооперационной среде, где мы создаем новые изображения по мере поступления данных. Иногда, когда новые данные поступают, нам необходимо повторно открыть изображение и обновить его, чтобы создать композиты, добавить оверлеи и т. д. Кроме добавления информации в изображение, это также требует изменения заголовков, легенд и т. д.
Существует ли что-то встроенное в matplotlib, что позволило бы мне сохранять и загружать мой объект matplotlib.pyplot для дальнейшего использования? Этот метод должен сохранять доступ ко всем связанным объектам, включая фигуры, линии, легенды и т. д. Возможно, я ищу решение с использованием pickle, но не уверен в этом.
5 ответ(ов)
На версии 1.2 библиотеки matplotlib было добавлено экспериментальное поддержку сериализации (pickling). Если у вас возникнут какие-либо проблемы с этой функцией, пожалуйста, дайте нам знать на mailing-листе mpl или откройте issue на github.com/matplotlib/matplotlib.
Надеюсь, это поможет!
ПРАВКА: Добавлен простой пример
import matplotlib.pyplot as plt
import numpy as np
import pickle
ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
ax.plot(x, y)
pickle.dump(ax, open('myplot.pickle', 'w'))
Затем в отдельной сессии:
import matplotlib.pyplot as plt
import pickle
ax = pickle.load(open('myplot.pickle'))
plt.show()
Маленькое дополнение к ответу Пелсона для тех, кто работает с JupyterHub.
Используйте %matplotlib notebook
перед загрузкой pickle. У меня не сработало %matplotlib inline
ни в JupyterHub, ни в Jupyter Notebook, и возникла ошибка, заканчивающаяся на
AttributeError: 'module' object has no attribute 'new_figure_manager_given_figure'
.
Вот пример кода:
import matplotlib.pyplot as plt
import numpy as np
import pickle
%matplotlib notebook
ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
plt.plot(x, y)
with open('myplot.pkl','wb') as fid:
pickle.dump(ax, fid)
Затем в отдельной сессии:
import matplotlib.pyplot as plt
import pickle
%matplotlib notebook
with open('myplot.pkl','rb') as fid:
ax = pickle.load(fid)
plt.show()
Попробуйте этот подход, если сталкиваетесь с проблемами при использовании pickle в Jupyter.
Я создавал графики для нескольких статей с помощью matplotlib. Вместо того чтобы просто сохранять изображение (как в MATLAB), я предпочитал писать скрипт, который визуализирует данные, а затем форматирует и сохраняет график. В случаях, когда я хотел оставить локальную копию данных (особенно если планировал снова с ними поработать), я нашёл numpy.savez() и numpy.load() очень полезными.
Сначала мне не хватало удобного процесса сохранения графика в MATLAB, но со временем я пришёл к тому, что предпочитаю данный подход, так как он включает данные в формате, который можно использовать для дальнейшего анализа.
Вы можете использовать следующий код для создания, сохранения и загрузки графиков в Jupyter Notebook с использованием matplotlib и pickle.
import matplotlib.pyplot as plt
import numpy as np
import pickle
# Создаем объект Figure с двумя подграфиками
fig, axes = plt.subplots(figsize=(20, 5), nrows=1, ncols=2)
x, y = np.arange(10), np.random.random(10)
# Строим графики на обоих подграфиках
axes[0].plot(x, y)
axes[1].plot(x, y)
plt.show()
# Указываем имя файла для сохранения
myfname = 'test'
if myfname != '':
fig.savefig(f'./{myfname}.png') # Сохраняем график в PNG
print(f'Файл сохранен в ./{myfname}.png')
# Сохраняем объект Figure с помощью pickle
with open(f'./{myfname}.png.pkl', 'wb') as fid:
pickle.dump(fig, fid)
print(f'Объект сохранен в ./{myfname}.png.pkl')
###################################
####### В отдельной сессии
myfname = 'test'
# Загружаем ранее сохраненный объект Figure
with open(f'./{myfname}.png.pkl', 'rb') as fh:
fig_loaded = pickle.load(fh)
# Получаем данные первого графика
print(fig_loaded.axes[0].lines[0].get_data())
fig_loaded # Отображаем загруженный график
Эта программа создает график с двумя подграфиками и сохраняет как сам график в формате PNG, так и его объект в pickle-файл. В отдельной сессии вы можете загружать сохраненный объект и получать данные, а также отображать график. Обратите внимание, что вам нужно будет вручную указать имя файла, если вы хотите сохранить что-то с помощью input
. В данном примере имя файла установлено для удобства.
Вы пробовали модуль pickle
? Он сериализует объект, записывает его в файл и потом может загрузить его из файла позже.
Сохранить график в файл изображения вместо его отображения
Как задать пределы осей в Matplotlib?
Когда использовать cla(), clf() или close() для очистки графика?
Размер маркеров в графиках рассеяния с помощью pyplot
Построение графиков с логарифмическими осями