当前位置: 首页 > 面试题库 >

Matplotlib循环绘制时内存不足

谷泳
2023-03-14
问题内容

我有一个相当简单的绘图例程,如下所示:

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'
        legendStrings[ACETATE] = 'ACETATE'
        legendStrings[BUTYRATE] = 'BUTYRATE'
        legendStrings[SUCCINATE] = 'SUCCINATE'
        legendStrings[HYDROGEN] = 'HYDROGEN'
        legendStrings[PROPIONATE] = 'PROPIONATE'
        legendStrings[METHANE] = "METHANE"

        legendStrings[RUMINOCOCCUS] = 'RUMINOCOCCUS'
        legendStrings[METHANOBACTERIUM] = "METHANOBACTERIUM"
        legendStrings[BACTEROIDES] = 'BACTEROIDES'
        legendStrings[SELENOMONAS] = 'SELENOMONAS'
        legendStrings[CLOSTRIDIUM] = 'CLOSTRIDIUM'

        legendStrings = [legendStrings[i] for i in columnNumbers]
        legend(legendStrings, loc='best')

        dt = datetime.datetime.now()
        dtAsString = dt.strftime('%d-%m-%Y_%H-%M-%S')

        if filenamePrefix is None:
            filenamePrefix = ''

        if filenamePrefix != '' and filenamePrefix[-1] != '_':
            filenamePrefix += '_'

        if saveFig: 
            savefig(filenamePrefix+dtAsString+'.eps')

        if saveThumb:
            savefig(filenamePrefix+dtAsString+'.png', dpi=300)


        if showFig: f.show()

        close('all')

当我在单次迭代中绘制此图时,它工作正常。但是,当我将其放入循环中时,matplotlib发出了嘶嘶声。

Traceback (most recent call last):
  File "c4hm_param_variation_h2_conc.py", line 148, in <module>
    plotColumns(columnNumbers, timeVector, out, showFig=False, filenamePrefix='c
4hm_param_variation_h2_conc_'+str(hydrogen_conc), saveFig=False, saveThumb=True)

  File "D:\phdproject\alexander paper\python\v3\plotcolumns.py", line 48, in plo
tColumns
    savefig(filenamePrefix+dtAsString+'.png', dpi=300)
  File "C:\Python25\lib\site-packages\matplotlib\pyplot.py", line 356, in savefi
g
    return fig.savefig(*args, **kwargs)
  File "C:\Python25\lib\site-packages\matplotlib\figure.py", line 1032, in savef
ig
    self.canvas.print_figure(*args, **kwargs)
  File "C:\Python25\lib\site-packages\matplotlib\backend_bases.py", line 1476, i
n print_figure
    **kwargs)
  File "C:\Python25\lib\site-packages\matplotlib\backends\backend_agg.py", line
358, in print_png
    FigureCanvasAgg.draw(self)
  File "C:\Python25\lib\site-packages\matplotlib\backends\backend_agg.py", line
314, in draw
    self.figure.draw(self.renderer)
  File "C:\Python25\lib\site-packages\matplotlib\artist.py", line 46, in draw_wr
apper
    draw(artist, renderer, *kl)
  File "C:\Python25\lib\site-packages\matplotlib\figure.py", line 773, in draw
    for a in self.axes: a.draw(renderer)
  File "C:\Python25\lib\site-packages\matplotlib\artist.py", line 46, in draw_wr
apper
    draw(artist, renderer, *kl)
  File "C:\Python25\lib\site-packages\matplotlib\axes.py", line 1735, in draw
    a.draw(renderer)
  File "C:\Python25\lib\site-packages\matplotlib\artist.py", line 46, in draw_wr
apper
    draw(artist, renderer, *kl)
  File "C:\Python25\lib\site-packages\matplotlib\legend.py", line 374, in draw
    bbox = self._legend_box.get_window_extent(renderer)
  File "C:\Python25\lib\site-packages\matplotlib\offsetbox.py", line 209, in get
_window_extent
    px, py = self.get_offset(w, h, xd, yd)
  File "C:\Python25\lib\site-packages\matplotlib\offsetbox.py", line 162, in get
_offset
    return self._offset(width, height, xdescent, ydescent)
  File "C:\Python25\lib\site-packages\matplotlib\legend.py", line 360, in findof
fset
    return _findoffset(width, height, xdescent, ydescent, renderer)
  File "C:\Python25\lib\site-packages\matplotlib\legend.py", line 325, in _findo
ffset_best
    ox, oy = self._find_best_position(width, height, renderer)
  File "C:\Python25\lib\site-packages\matplotlib\legend.py", line 817, in _find_
best_position
    verts, bboxes, lines = self._auto_legend_data()
  File "C:\Python25\lib\site-packages\matplotlib\legend.py", line 669, in _auto_
legend_data
    tpath = trans.transform_path(path)
  File "C:\Python25\lib\site-packages\matplotlib\transforms.py", line 1911, in t
ransform_path
    self._a.transform_path(path))
  File "C:\Python25\lib\site-packages\matplotlib\transforms.py", line 1122, in t
ransform_path
    return Path(self.transform(path.vertices), path.codes,
  File "C:\Python25\lib\site-packages\matplotlib\transforms.py", line 1402, in t
ransform
    return affine_transform(points, mtx)
MemoryError: Could not allocate memory for path

如果这有所不同,则会在迭代2(从1开始)上发生。该代码在具有python 2.5和matplotlib 0.99.1,numpy 1.3.0和scipy
0.7.1的Windows XP 32位上运行。

编辑:
现在,代码已更新,以反映崩溃实际上是在调用时发生的事实legend()。评论出来可以解决问题,尽管很明显,我仍然希望能够在图上放一个图例…


问题答案:

每个循环都应该生成一个新图形吗?我看不到您会逐个关闭它或创建新的图形实例。

在循环末尾将其保存后,此调用将清除当前图形:

pyplot.clf()

不过,我将进行重构,并使您的代码更加“ OO”,并在每个循环上创建一个新的Figure实例:

from matplotlib import pyplot

while True:
  fig = pyplot.figure()
  ax = fig.add_subplot(111)
  ax.plot(x,y)
  ax.legend(legendStrings, loc = 'best')
  fig.savefig('himom.png')
  # etc....


 类似资料:
  • 问题内容: 我正在尝试使用OpenCV从摄像机实时绘制一些数据。但是,实时绘图(使用matplotlib)似乎不起作用。 我将问题隔离到以下简单示例中: 我希望该示例可以单独绘制1000点。实际发生的情况是,窗口弹出并显示第一个点(表示正确),然后等待循环结束,然后填充图的其余部分。 有什么想法为什么我一次看不到点呢? 问题答案: 这是有问题的代码的工作版本(至少需要从2011-11-14起版本)

  • 我正试图用OpenCV实时地从相机中绘制一些数据。然而,实时绘图(使用matplotlib)似乎不起作用。 我希望这个例子能画出1000个点。实际发生的情况是,窗口弹出并显示第一个点(可以了),然后等待循环完成,然后填充图的其余部分。 有什么想法为什么我没有看到点一次一个?

  • Matplotlib 支持广泛的文本格式,比如 TTF 页面语言、Unicode 字符等。这是因为 Matplotlib 内置了 matplotlib.font_manager 字体管理器,它是一个实现了跨平台,并符合 W3C 字体查找算法的字体集合。 TTF(TrueType Font) 是苹果公司和微软公司合作开发的页面描述语言,用来描述字符的轮廓,结合了光栅技术和矢量技术的优点。 用户可以对

  • 问题内容: 我有一个格式为(HH:MM:SS.mmmmmm)的时间戳数组和另一个浮点数数组,每个浮点数对应于timestamp数组中的一个值。 我可以使用Matplotlib在x轴上绘制时间,在y轴上绘制数字吗? 我试图这样做,但是不知何故它只接受浮点数数组。如何获得时间图?我必须以任何方式修改格式吗? 问题答案: 你必须首先将时间戳转换为对象(使用)。然后使用将日期转换为格式。 使用以下方式绘制

  • 您好,我对jquery没有什么问题。首先,我有: 大众BORA 1.9TDI 1990 1995 奥迪A3 2.0TFSI 2006 2008 但我想实现: VW BORA 1.9TDI 1990 VW BORA 1.9TDI 1991 VW BORA 1.9TDI 1992 VW BORA 1.9TDI 1993 VW BORA 1.9TDI 1994 VW BORA 1.9TDI 1995 A

  • 问题内容: 我在Python 2.7中使用matplotlib绘制填充的轮廓图。我想将其覆盖在图像上,所以我使用alpha关键字使绘图半透明。当我这样做时,轮廓的主体是正确的透明度,但是轮廓f()在不同级别之间的边界上绘制了不需要的线。我试图用关键字参数linecolor =’none’消除它们,但这没有帮助。 码: CS = map.contourf(xi,yi,zi,25,alpha = 0.