2013-08-13 3 views
2

Я черчение и спасти тысячи файлов для последующего анимации в цикле, как так:Matplotlib сбоя после сохранения многих участков

import matplotlib.pyplot as plt 
for result in results: 
    plt.figure() 
    plt.plot(result)      # this changes 
    plt.xlabel('xlabel')     # this doesn't change 
    plt.ylabel('ylabel')     # this doesn't change 
    plt.title('title')     # this changes 
    plt.ylim([0,1])      # this doesn't change 
    plt.grid(True)      # this doesn't change 
    plt.savefig(location, bbox_inches=0) # this changes 

Когда я запускаю это с большим количеством результатов, он выходит из строя после того, как несколько тысяч участков сохранены. Я думаю, что я хочу, чтобы повторное использование моих осей, как в этом ответе: https://stackoverflow.com/a/11688881/354979, но я не понимаю, как это сделать. Как я могу его оптимизировать?

+1

я столкнулся с подобной проблемой, как это несколько недель назад. Я решил проблему, создав сюжеты в подгруппах, сохранив их на диске, очистив их из своей памяти, а затем перейдя к сюжету остальных. Я думаю, что это из-за неэффективности в том, как matplotlib держит замыслы в памяти при работе с большими или многими сюжетами. К сожалению, одна из предпосылок библиотеки заключается в том, что используемые данные должны быть * относительно небольшими. Мой заговор работал отлично, пока я мог держать графики в памяти, а не поменяться на диск. – agconti

+4

добавьте 'plt.close ('all')' в конце вашего цикла. Это не сделает его быстрее, но это не позволит вам избавиться от нехватки памяти. – tacaswell

+0

@tcaswell спасибо за подсказку! Я не знал о методе 'plt.close ('all')'. – agconti

ответ

3

Я бы создал единую фигуру и каждый раз очищал фигуру (используйте .clf).

import matplotlib.pyplot as plt 

fig = plt.figure() 

for result in results: 
    fig.clf() # Clears the current figure 
    ... 

Вы работаете из памяти, так как каждый вызов к plt.figure создает новый объект фигуры. Комментарий Per @ tcaswell, я думаю, что это будет быстрее, чем .close. Различия объясняются:

When to use cla(), clf() or close() for clearing a plot in matplotlib?

+0

Есть ли разница между 'fig = plt.figure(); для результата в результатах: fig.clf() ... 'и' plt.figure(); для результата в результатах: plt.clf() ... '? – rhombidodecahedron

+1

@EarlBellinger Нет никакой разницы, когда у вас есть только одна фигура. 'plt.figure(). clf' вызывает текущую цифру, а' fig.clf' вызывает именованный объект, представляющий нашу фигуру. Если бы у нас было несколько цифр, они могли бы быть разными. – Hooked

0

Хотя этот вопрос старый, ответ был бы:

import matplotlib.pyplot as plt 
fig = plt.figure() 
plot = plt.plot(results[0]) 
title = plt.title('title') 

plt.xlabel('xlabel') 
plt.ylabel('ylabel') 
plt.ylim([0,1]) 
plt.grid(True) 

for i in range(1,len(results)): 
    plot.set_data(results[i]) 
    title.set_text('new title') 
    plt.savefig(location[i], bbox_inches=0) 
plt.close('all') 
Смежные вопросы