我有一个相当简单的绘图例程,如下所示:
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()。评论出来可以解决问题,尽管很明显,我仍然希望能够在图上放一个图例…
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....