|
From: Benjamin R. <ben...@ou...> - 2013-10-10 14:47:55
|
On Thu, Oct 10, 2013 at 10:21 AM, Michael Droettboom <md...@st...>wrote: > Thanks. This is much more helpful. > > What we need, however, is a "self contained, standalone example". The > code below calls functions that are not present. See http://sscce.org/for why this is so important. Again, I would have to guess what those > functions do -- it may be relevant, it may not. If I have something that I > can *just run* then I can use various introspection tools to see what is > going wrong. > > Mike > > That being said, I do see a number of anti-patterns here that could be significant. For example: for _x, _y, _c in izip(mydata_x, mydata_y, colors): # _Line2D = _ax1.plot(_x, _y) # returns Line2D object _my_PathCollection = _ax1.scatter(_x, _y, color=_c, s=objsize) # , label=_l) # returns PathCollection object _series.append(_my_PathCollection) Could be more concisely written as: _series = [_ax1.scatter(_x, _y, color=_c, s=objsize) for _x, _y, _c in izip(mydata_x, mydata_y, colors)] Python can then more intelligently handle memory management by intelligently allocating the memory for _series. You can then use _series.extend() for when you are doing the scatter plots for _ax2 with a similar list comprehension (or even a generator statement). I would also question the need to store _series in the first place. You use it for the call to legend, but you could have simply passed a label to each call of scatter as well. Some other things of note: 1) The clear() call here is completely useless as the figure is already clear. _figure = pylab.figure() _figure.clear() 2) When limits are set on an axis, autoscaling for that axis is automatically turned off anyway, so no need to turn if off yourself (also not sure why you are calling out to an external function here): _ax1.set_autoscale_on(False) set_limits(_ax1, xmin, xmax, ymin, ymax) 3) Finally, some discussion on the end of your function here: if legends: _figure.savefig(filename, dpi=100) #, bbox_inches='tight') del(_my_PathCollection) del(_ax2) else: _figure.savefig(filename, dpi=100) del(_series) del(_ax1) _figure.clear() del(_figure) pylab.clf() pylab.close() first, as discussed, you can easily eliminate the need for _my_PathCollection and possibly even _series. Second, when calling _figure.clear(), all of its axes objects are deleted for you, so you don't need to delete them yourself. Third, you delete the _figure object, but then call "pylab.clf()". I haven't double-checked exactly what would happen, but I think you might run the risk of accidentially clearing some other existing figure by doing that. Lastly, you then call pylab.close(), which I point out the same caveat as before. Really, all you needed was pylab.close() and you can eliminate the 5 preceding lines and the other two del()'s. All del() really does is remove the variable out of scope. Once that object is out of everybody's scope, then the gc can clean it up. Since the function was ending anyway, there is no point in deleting the variable. I don't know if this would fix your problem, and there are a bunch of other style issues here (particularly, pylab really shouldn't be used this way), but hopefully this gives some food for thought. Cheers! Ben Root |