0

Сохранение и загрузка объекта matplotlib.pyplot

2

Я работаю в псевдооперационной среде, где мы создаем новые изображения по мере поступления данных. Иногда, когда новые данные поступают, нам необходимо повторно открыть изображение и обновить его, чтобы создать композиты, добавить оверлеи и т. д. Кроме добавления информации в изображение, это также требует изменения заголовков, легенд и т. д.

Существует ли что-то встроенное в matplotlib, что позволило бы мне сохранять и загружать мой объект matplotlib.pyplot для дальнейшего использования? Этот метод должен сохранять доступ ко всем связанным объектам, включая фигуры, линии, легенды и т. д. Возможно, я ищу решение с использованием pickle, но не уверен в этом.

5 ответ(ов)

0

На версии 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()
0

Маленькое дополнение к ответу Пелсона для тех, кто работает с 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.

0

Я создавал графики для нескольких статей с помощью matplotlib. Вместо того чтобы просто сохранять изображение (как в MATLAB), я предпочитал писать скрипт, который визуализирует данные, а затем форматирует и сохраняет график. В случаях, когда я хотел оставить локальную копию данных (особенно если планировал снова с ними поработать), я нашёл numpy.savez() и numpy.load() очень полезными.

Сначала мне не хватало удобного процесса сохранения графика в MATLAB, но со временем я пришёл к тому, что предпочитаю данный подход, так как он включает данные в формате, который можно использовать для дальнейшего анализа.

0

Вы можете использовать следующий код для создания, сохранения и загрузки графиков в 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. В данном примере имя файла установлено для удобства.

0

Вы пробовали модуль pickle? Он сериализует объект, записывает его в файл и потом может загрузить его из файла позже.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь