Hi, I am trying to figure out how to produce a mixed-mode rendering PDF of a contourf plot.
I tried something like this: >>> from pylab import meshgrid, sin, cos, linspace, contourf, savefig, clf >>> x, y = meshgrid(*(linspace(-1,1,500),)*2) >>> z = sin(20*x**2)*cos(30*y) >>> c = contourf(x,y,z,30,rasterized=True) >>> savefig('tst0.pdf') but this does not work. (The QuadContourSet c does not support set_rasterized() so the rasterized argument is just ignored. Is the ignoring of the argument a bug or a feature?) I tried calling set_rasterized() on all of the of PathCollection objects in c.collections but this did not help: >>> for pc in c.collections: >>> pc.set_rasterized(True) >>> savefig('tst1.pdf') While this helps, there are still 30 rasterized patches which renders slowly as a PDF. I found one possible solution: make a custom Collection subclass as shown below, then remove all of the PathCollection instances from the figure, inserting instead this new collection as a single rasterized entity: >>> insert(c) # See code below for definition of insert() >>> savefig('tst2.pdf') The file-sizes are: $ ls -lah *.pdf ... 4.2M Aug 13 02:38 tst0.pdf ... 1.8M Aug 13 02:38 tst1.pdf ... 629K Aug 13 02:40 tst2.pdf but tst2.pdf looks as good as tst1.pdf, and is much faster to load. (There are some faint white lines between the patches similar to those discussed before: http://thread.gmane.org/gmane.comp.python.matplotlib.devel/8540/focus=8590 but the rasterizer here is in the PDF backend, so maybe something can be done? Should I look into this as a potential bug? I am using the version of matplotlib included with the latest EPD on a 32 bit Mac.) Question: Is there some way of doing this with current matplotlib API, or is some sort of extension like this required? If the latter, is there anything I should be careful about? (The ListCollection should probably be inserted in contourf rather than retroactively like this.) Thanks, Michael. ----------------------------------------------- from matplotlib.collections import Collection from matplotlib.artist import allow_rasterization from matplotlib import pyplot as plt class ListCollection(Collection): def __init__(self, collections, **kwargs): Collection.__init__(self, **kwargs) self.set_collections(collections) def set_collections(self, collections): self._collections = collections def get_collections(self): return self._collections @allow_rasterization def draw(self, renderer): for _c in self._collections: _c.draw(renderer) def insert(c): collections = c.collections for _c in collections: _c.remove() cc = ListCollection(collections, rasterized=True) ax = plt.gca() ax.add_artist(cc) return cc ------------------------------------------------------------------------------ FREE DOWNLOAD - uberSVN with Social Coding for Subversion. Subversion made easy with a complete admin console. Easy to use, easy to manage, easy to install, easy to extend. Get a Free download of the new open ALM Subversion platform now. http://p.sf.net/sfu/wandisco-dev2dev _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users