Как удалить строки в графике Matplotlib


Как я могу удалить строку (или строки) осей matplotlib таким образом, чтобы она фактически собирала мусор и освобождала память? Приведенный ниже код, похоже, удаляет строку, но никогда не освобождает память (даже с явными вызовами gc.соберите ())

from matplotlib import pyplot
import numpy
a = numpy.arange(int(1e7))
# large so you can easily see the memory footprint on the system monitor.
fig = pyplot.Figure()
ax  = pyplot.add_subplot(1, 1, 1)
lines = ax.plot(a) # this uses up an additional 230 Mb of memory.
# can I get the memory back?
l = lines[0]
l.remove()
del l
del lines
# not releasing memory
ax.cla() # this does release the memory, but also wipes out all other lines.

Так есть ли способ просто удалить одну строку из осей и вернуть память? Это решение также не работает.

4 60

4 ответа:

Я показываю, что сочетание lines.pop(0)l.remove() и del l делает трюк.

from matplotlib import pyplot
import numpy, weakref
a = numpy.arange(int(1e3))
fig = pyplot.Figure()
ax  = fig.add_subplot(1, 1, 1)
lines = ax.plot(a)

l = lines.pop(0)
wl = weakref.ref(l)  # create a weak reference to see if references still exist
#                      to this object
print wl  # not dead
l.remove()
print wl  # not dead
del l
print wl  # dead  (remove either of the steps above and this is still live)

Я проверил ваш большой набор данных, и выпуск памяти также подтверждается на системном мониторе.

конечно, более простой способ (когда не проблема-стрельба) было бы выскочить из списка и позвонить remove на линейном объекте без создания жесткой ссылки на него:

lines.pop(0).remove()

это очень длинное объяснение, которое я напечатал для своего коллеги. Я думаю, что это было бы полезно и здесь. Но будьте терпеливы. Я добираюсь до реальной проблемы, которая у вас есть к концу. Так же, как тизер, это вопрос наличия дополнительных ссылок на ваш Line2D объекты, висящие вокруг.

предупреждение: еще одна заметка, прежде чем мы погрузимся. Если вы используете IPython для проверки этого, IPython сохраняет ссылки самостоятельно, и не все из них слабаки. Итак, тестирование сборки мусора в IPython не работает. Это просто запутывает дело.

Ладно, поехали. Каждый

Я пробовал много разных ответов на разных форумах. Я думаю, это зависит от машины, которую вы разрабатываете. Но я использовал заявление

ax.lines = []

и прекрасно работает. Я не использую cla (), потому что он удаляет все определения, которые я сделал для участка

Ex.

pylab.setp(_self.ax.get_yticklabels(), fontsize=8)

но я пытался удалить строки много раз. Также используя библиотеку weakref, чтобы проверить ссылку на эту строку, пока я удалял, но ничего не работало мне.

надеюсь, что это работает для кого-то еще =D

(используя тот же пример, что и парень выше)

from matplotlib import pyplot
import numpy
a = numpy.arange(int(1e3))
fig = pyplot.Figure()
ax  = fig.add_subplot(1, 1, 1)
lines = ax.plot(a)

for i, line in enumerate(ax.lines):
    ax.lines.pop(i)
    line.remove()