相关疑难解决方法(0)

何时使用cla(),clf()或close()清除matplotlib中的图?

Matplotlib提供以下功能:

cla()   # Clear axis
clf()   # Clear figure
close() # Close a figure window
Run Code Online (Sandbox Code Playgroud)

该文档没有提供很多关于这些功能之间的区别的见解.我什么时候应该使用每个功能,它究竟做了什么?

plot matplotlib

492
推荐指数
3
解决办法
62万
查看次数

关于太多公开数字的警告

在我创建许多数字的脚本中fix, ax = plt.subplots(...),我收到警告RuntimeWarning:已打开超过20个数字.通过pyplot接口(matplotlib.pyplot.figure)创建的数字将保留,直到明确关闭,并可能消耗太多内存.

但是,我不明白为什么我得到这个警告,因为保存图后fig.savefig(...),我删除它fig.clear(); del fig.我的代码中没有任何一点,我一次打开多个数字.尽管如此,我还是得到了关于太多公开数字的警告.这是什么意思/如何避免收到警告?

python matplotlib python-3.x

128
推荐指数
3
解决办法
7万
查看次数

如何在创建matplotlib数字后释放内存

我有几个matlpotlib函数卷入了一些django-celery任务.

每次调用任务时,RAM都专用于python.不久之后,python占用了所有的RAM.

问题:我该如何释放这个记忆?

更新2 - 第二个解决方案:

我问过类似的问题,特别是有关内存锁定matplotlib错误的时候,但是我有一个很好的回答这个问题.clf(),.close()以及gc.collect()如果使用多进程运行在单独的进程中绘图功能,其内存会自动释放不需要一旦过程结束.

Matplotlib错误导致内存泄漏.我怎样才能释放那段记忆?

更新 - 解决方案:

这些stackoverflow帖子建议我可以使用以下命令释放matplotlib对象使用的内存:

.clf():在循环中绘图时,Matplotlib内存不足

.close():Python matplotlib:指定图形大小时未释放内存

import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)

以下是我用来测试解决方案的示例:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import import figure, savefig
import numpy as np
import gc      

a = np.arange(1000000)
b = np.random.randn(1000000)

fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w')
fig.set_size_inches(10,7)
ax = fig.add_subplot(111)
ax.plot(a, b)

fig.clf()
plt.close()
del a, b
gc.collect()
Run Code Online (Sandbox Code Playgroud)

python memory-leaks numpy matplotlib

58
推荐指数
1
解决办法
3万
查看次数

在绘制循环时,Matplotlib内存不足

我有一个相当简单的绘图程序,看起来像这样:

from __future__ import division
import datetime
import matplotlib
matplotlib.use('Agg')
from matplotlib.pyplot import figure, plot, show, legend, close, savefig, rcParams
import numpy
from globalconstants import *

    def plotColumns(columnNumbers, t, out, showFig=False, filenamePrefix=None, saveFig=True, saveThumb=True):
        lineProps = ['b', 'r', 'g', 'c', 'm', 'y', 'k', 'b--', 'r--', 'g--', 'c--', 'm--', 'y--', 'k--', 'g--', 'b.-', 'r.-', 'g.-', 'c.-', 'm.-', 'y.-', 'k.-']

        rcParams['figure.figsize'] = (13,11)
        for i in columnNumbers:
            plot(t, out[:,i], lineProps[i])

        legendStrings = list(numpy.zeros(NUMCOMPONENTS)) 
        legendStrings[GLUCOSE] = 'GLUCOSE'
        legendStrings[CELLULOSE] = 'CELLULOSE'
        legendStrings[STARCH] = 'STARCH' …
Run Code Online (Sandbox Code Playgroud)

python numpy matplotlib

25
推荐指数
3
解决办法
4万
查看次数

关闭Matplotlib数字

我正在使用Matplotlib和MPLD3来创建可以在html plages中显示的图形(使用django).目前,我的图表是从csv文件中提取的数据动态生成的.我经常在终端收到这条消息:

运行时警告:已打开超过20个数字.通过pyplot接口(matplotlib.pyplot.figure)创建的数字将保留,直到明确关闭,并可能消耗太多内存.(要控制此警告,请参阅rcParam figure.max_num_figures).max_open_warning,RuntimeWarning)

我不确定它的意思,但我假设它意味着我应该有一些方法来关闭未使用的图形.无论如何要做到这一点还是完全偏离基地?谢谢.

python matplotlib

13
推荐指数
2
解决办法
2万
查看次数

Matplotlib错误导致内存泄漏.我怎样才能释放那段记忆?

我正在运行包含matplotlib的django应用程序,并允许用户指定图形的轴.这可能导致'溢出错误:超出Agg复杂度'

当发生这种情况时,高达100MB的RAM被捆绑起来.通常我使用fig.gcf(),, plot.close()和释放内存gc.collect(),但与错误相关的内存似乎与绘图对象无关.

有谁知道我怎么能释放那个记忆?

谢谢.

这是一些代码,它给出了Agg Complexity Error.

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np      
import gc

a = np.arange(1000000)
b = np.random.randn(1000000)

fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w')
fig.set_size_inches(10,7)
ax = fig.add_subplot(111)
ax.plot(a, b)

fig.savefig('yourdesktop/random.png')   # code gives me an error here

fig.clf()    # normally I use these lines to release the memory
plt.close()
del a, b
gc.collect()
Run Code Online (Sandbox Code Playgroud)

python memory-leaks matplotlib

11
推荐指数
2
解决办法
6745
查看次数

防止matplotlib有状态

如果我创建一个Axes对象matplotlib并进行变异(即通过绘制一些数据)然后我调用一个函数而不将我的Axes对象传递给该函数,那么该函数仍然可以改变我的Axes.例如:

import matplotlib.pyplot as plt
import numpy as np

def innocent_looking_function():
    #let's draw a red line on some unsuspecting Axes!
    plt.plot(100*np.random.rand(20), color='r')

fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20), color='b') #draw blue line on ax
#ax now has a blue line, as expected

innocent_looking_function()
#ax now unexpectedly has a blue line and a red line!
Run Code Online (Sandbox Code Playgroud)

我的问题是:我能否一般地阻止这种全局变量行为?我知道我可以在打电话plt.close()之前打电话给innocent_looking_function()但是有什么办法让这个默认吗?

python matplotlib

8
推荐指数
1
解决办法
512
查看次数

在 matplotlib savefig 之后 close() 不释放内存

我正在运行一个 python 程序,它每隔几分钟重新绘制一个图形,但每次它运行时,它使用的内存都会增加一点,很快我使用的树莓派就会变慢。

这是相关的一段代码:

import matplotlib.pyplot as plt
import matplotlib.dates as md
from memory_profiler import profile

@profile
def plotter(file_name, plot_name):
    with open(filen_name, 'r') as readings:
        reader = csv.reader(readings, delimiter=',')
        data = [row for row in reader]

    plt.plot(data[2], data[0])
    ax = gca()
    xfmt = md.DateFormatter('%H:%M') # xaxis is datetimes
    ax.xaxis.set_major_formatter(xfmt)
    plt.legend()

    plt.savefig(plot_name, transparent=True)
    plt.clf()
    plt.cla()
    plt.close()
Run Code Online (Sandbox Code Playgroud)

该函数的调用方式如下:

 while True:
     plotter(file_name, plot_name)
     sleep(100)
Run Code Online (Sandbox Code Playgroud)

memory_profiler 输出很好的输出,但它总是看起来像这样:

Line #    Mem usage    Increment   Line Contents
================================================
38     36.2 MiB      0.6 MiB       plt.savefig(plot_name, transparent=True)
39     36.2 …
Run Code Online (Sandbox Code Playgroud)

python memory matplotlib

5
推荐指数
1
解决办法
3161
查看次数

标签 统计

matplotlib ×8

python ×7

memory-leaks ×2

numpy ×2

memory ×1

plot ×1

python-3.x ×1