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
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users