matplotlib CRASHes when saving as a postscript file

Hi

I finally managed to write a simplified version of my python script
which crashes when trying to save the figure as a postscript file. (this
is related to a previous post). See below. The script is provided, as
well as the full error message.

Sorry for the long script, but basically I am plotting 3x7 arrays via
pcolormesh. The script looks pretty dum because it was adapted from a
more complicated one where the bins/pixels are not exactly squared and
are rotated. In the version below I have tried to remove the unncessary
complication. And I get a failure from ghostscript when I try to save it
as eps. It works when I save it as a png.

Can anyone tell me what's wrong there? Again I am using:

### On an OpenSuse 11.2, 64b
xpdf distiller (but I tried others).
matplotlib 0.99.1.1
backend WXAgg version 2.8.10.1
Python 2.6.2 (r262:71600, Oct 24 2009, 03:15:21)
IPython 0.10 -- An enhanced Interactive Python.

THANKS
Eric

···

====================================================================

######################################################################
# Script to run which crashes when saving the figure as an eps file
######################################################################
#!/usr/bin/python
import numpy as num
import pylab as pl

def pos(i,j, w, h) :
   return [0.05+ j*(w+0.02), 0.99 - (i+1)*(h+0.023)+0.025, w, h]

## Opening the figure
## Figure
pl.figure(1, figsize=(5*1.2, 7*1.5))
fig = pl.gcf()
pl.clf()

## Size of figure
figH = fig.get_figheight()
figW = fig.get_figwidth()
w = 0.99 / 3. -0.03
h = 0.99 / 7 - 0.022

## List of data to plot (I take 7 times the same stuff)
listgal = ["1","2","3","4","5","6",",7"]

## Initialisation of start, end and step
ngal = len(listgal)
start = [-30.,-30.]
end = [30.,30.]
npix = [80,80]
x = num.linspace(start[0],end[0], npix[0])
y = num.linspace(start[1],end[1], npix[1])
step = [x[1]-x[0], y[1]-y[0]]
X,Y = num.meshgrid(x,y)

## Initialisation of data
data = num.random.random((npix[0], npix[1]))

pl.ioff()
for k in range(ngal) :
   gal = listgal[k]

   ## Coordinates

   ## Grid for rotation
   Xp,Yp = X - step[0]/2., Y - step[1]/2.
   X1,Y1 = X+step[0]/2.,Y+step[1]/2.
   X2,Y2 = X-step[0]/2.,Y+step[1]/2.
   X3,Y3 = X-step[0]/2.,Y-step[1]/2.
   X4,Y4 = X+step[0]/2.,Y-step[1]/2.
   minXc = num.min(num.concatenate((X1,X2,X3,X4)))
   maxXc = num.max(num.concatenate((X1,X2,X3,X4)))
   minYc = num.min(num.concatenate((Y1,Y2,Y3,Y4)))
   maxYc = num.max(num.concatenate((Y1,Y2,Y3,Y4)))
   dX = maxXc - minXc
   dY = maxYc - minYc

   ## Deriving the right aspect ratio etc
   aspectIma = dX / dY
   aspectFig = figW / figH
   aspectWin = w / h
   if (aspectIma < aspectWin*aspectFig) :
      maxXc = maxXc * aspectFig * aspectWin / aspectIma
      minXc = minXc * aspectFig * aspectWin / aspectIma
   else :
      maxYc = maxYc * aspectIma / (aspectFig * aspectWin)
      minYc = minYc * aspectIma / (aspectFig * aspectWin)
   extentR = minXc, maxXc, minYc, maxYc

   cmap = pl.cm.jet
   minI, maxI = 0., 1.
   cmap.set_bad('w',1.0)
   j = 0
   ax1 = fig.add_axes(pos(k,j, w, h))
   map1 = ax1.pcolormesh(Xp,Yp,data,shading='flat',vmin=minI,vmax=maxI,
cmap=cmap)
   pl.plot([0.],[0.],'k+', markersize=10, lw=3)
   xticklabels = pl.getp(pl.gca(), 'xticklabels')
   pl.setp(xticklabels, fontsize=8)
   yticklabels = pl.getp(pl.gca(), 'yticklabels')
   pl.setp(yticklabels, fontsize=8)
   pl.axis(extentR)
   j += 1

   ax2 = fig.add_axes(pos(k,j, w, h))
   map2 = ax2.pcolormesh(Xp,Yp,data,shading='flat',vmin=minI,vmax=maxI,
cmap=cmap)
   pl.plot([0.],[0.],'k+', markersize=10, lw=3)
   pl.axis(extentR)
   ax2.set_yticks([])
   xticklabels = pl.getp(pl.gca(), 'xticklabels')
   pl.setp(xticklabels, fontsize=8)
   pl.text(0.02,0.96, "%4.0f/%4.0f"%(minI,maxI),
verticalalignment='top',rotation='vertical',transform = ax2.transAxes,
fontsize=8)
   j += 1

   ax3 = fig.add_axes(pos(k,j, w, h))
   map2 = ax3.pcolormesh(Xp,Yp,data,shading='flat',vmin=0.,vmax=1.,
cmap=cmap)
   pl.plot([0.],[0.],'k+', markersize=10, lw=3)
   pl.axis(extentR)
   ax3.set_yticks([])
   xticklabels = pl.getp(pl.gca(), 'xticklabels')
   pl.setp(xticklabels, fontsize=8)
   pl.text(0.02,0.96, "%4.0f/%4.0f"%(minI,maxI),
verticalalignment='top',rotation='vertical',transform = ax3.transAxes,
fontsize=8)
   j += 1
   pl.text(0.92,0.5, gal,
rotation='vertical',verticalalignment='center',transform = ax3.transAxes)

   k += 1

pl.ion()
pl.show()

#######################################################################
## ERROR MESSAGE WHEN DOING:
## savefig("tmp.eps")
########################################################################
savefig("toto.eps")
Error: /limitcheck in --def--
Operand stack:
   pa_c2c --nostringval--
Execution stack:
   %interp_exit .runexec2 --nostringval-- --nostringval--
--nostringval-- 2 %stopped_push --nostringval-- --nostringval--
  --nostringval-- false 1 %stopped_push 1878 1 3
%oparray_pop 1877 1 3 %oparray_pop 1861 1 3 %oparray_pop
  1755 1 3 %oparray_pop --nostringval-- %errorexec_pop
.runexec2 --nostringval-- --nostringval-- --nostringval-- 2
%stopped_push --nostringval--

Dictionary stack:

   --dict:1171/3371(ro)(G)-- --dict:1/20(G)-- --dict:74/200(L)--
--dict:5/6(ro)(L)-- --dict:179/300(L)-- --dict:44/200(L)--
--dict:65534/65534(L)--

Current allocation mode is local

Last OS error: 2

Current file position is 14229051

GPL Ghostscript 8.64: Unrecoverable error, exit code 1

---------------------------------------------------------------------------

RuntimeError Traceback (most recent call
last)

/science/ATLAS3D/python/Analysis/Try.py in <module>()
----> 1
      2
      3
      4
      5

/usr/lib64/python2.6/site-packages/matplotlib/pyplot.pyc in
savefig(*args, **kwargs)
    354 def savefig(*args, **kwargs):

    355 fig = gcf()

--> 356 return fig.savefig(*args, **kwargs)

    357 if Figure.savefig.__doc__ is not None:

    358 savefig.__doc__ = dedent(Figure.savefig.__doc__)

/usr/lib64/python2.6/site-packages/matplotlib/figure.pyc in
savefig(self, *args, **kwargs)
   1030 patch.set_alpha(0.0)

   1031

-> 1032 self.canvas.print_figure(*args, **kwargs)

   1033

   1034 if transparent:

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_wxagg.pyc
in print_figure(self, filename, *args, **kwargs)
     98 def print_figure(self, filename, *args, **kwargs):

     99 # Use pure Agg renderer to draw

--> 100 FigureCanvasAgg.print_figure(self, filename, *args,
**kwargs)
    101 # Restore the current view; this is needed because the

    102 # artist contains methods rely on particular attributes

/usr/lib64/python2.6/site-packages/matplotlib/backend_bases.pyc in
print_figure(self, filename, dpi, facecolor, edgecolor, orientation,
format, **kwargs)

   1474 orientation=orientation,

   1475 bbox_inches_restore=_bbox_inches_restore,

-> 1476 **kwargs)

   1477 finally:

   1478 if bbox_inches and restore_bbox:

/usr/lib64/python2.6/site-packages/matplotlib/backend_bases.pyc in
print_eps(self, *args, **kwargs)
   1327 from backends.backend_ps import FigureCanvasPS # lazy
import
   1328 ps = self.switch_backends(FigureCanvasPS)

-> 1329 return ps.print_eps(*args, **kwargs)

   1330

   1331 def print_pdf(self, *args, **kwargs):

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
print_eps(self, outfile, *args, **kwargs)
    853

    854 def print_eps(self, outfile, *args, **kwargs):

--> 855 return self._print_ps(outfile, 'eps', *args, **kwargs)

    856

    857

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
_print_ps(self, outfile, format, *args, **kwargs)
    882 self._print_figure_tex(outfile, format, imagedpi,
facecolor, edgecolor,
    883 orientation, isLandscape,
papertype,
--> 884 **kwargs)

    885 else:

    886 self._print_figure(outfile, format, imagedpi,
facecolor, edgecolor,

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
_print_figure_tex(self, outfile, format, dpi, facecolor, edgecolor,
orientation, isLandscape, papertype, **kwargs)

   1188 gs_distill(tmpfile, isEPSF, ptype=papertype,
bbox=bbox)
   1189 elif rcParams['ps.usedistiller'] == 'xpdf':

-> 1190 xpdf_distill(tmpfile, isEPSF, ptype=papertype,
bbox=bbox)
   1191 elif rcParams['text.usetex']:

   1192 if False: pass # for debugging

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
xpdf_distill(tmpfile, eps, ptype, bbox)
   1345 fh = file(outfile)
   1346 if exit_status: raise RuntimeError('ps2pdf was not able to
process your \
-> 1347 image.\n\Here is the report generated by ghostscript:\n\n' +
fh.read())
   1348 else: verbose.report(fh.read(), 'debug')
   1349 fh.close()

RuntimeError: ps2pdf was not able to process your image.
\Here is the report generated by ghostscript:

I can reproduce this error with the current svn.

I doubt if this is a matplotlib issue, because it works fine if the
number of axes is small.
To me, it seems as some memory error in the ghostscript, but my quick
googling did not show any relevant information.
So, I hope some postscript expert take a look at the issue.

However, note that pcolormesh in backends other than agg is extremely
inefficient, and I strongly discourage its use in other backends.
Your current example could be much efficient if you simply can use
imshow. Do you have to use pcolormesh? Your current example seems to
be easily convertible to imshow, but you original example may not.

In case the use of pcolormesh is not avoidable, I can think of two workarounds.

1) save as pdf first then convert to eps. Saving as pdf will take as
much time as saving as ps.

2) Save as eps but rasterize the pcolormesh plots. This is my choice
and saving time is also not very long. As a matter of fact, whenever
pcolormesh is used, I strongly recommend to consider rasterizing it.

For your current script, you may add something like below at the end
of your for-loop.

  map1.set_zorder(0.5)
  map2.set_zorder(0.5)
  map3.set_zorder(0.5)
  ax1.set_rasterization_zorder(0.6)
  ax2.set_rasterization_zorder(0.6)
  ax3.set_rasterization_zorder(0.6)

This code needs to be inside the for-loop so that all the pcolormesh
plots get rasterized.
Also, note that, in your current script, the third pcolormesh plot is
assigned to "map2", instead of "map3", so you need to fix this first.

Regards,

-JJ

···

On Thu, Jan 7, 2010 at 11:17 AM, Eric Emsellem <eemselle@...513...> wrote:

Hi

I finally managed to write a simplified version of my python script
which crashes when trying to save the figure as a postscript file. (this
is related to a previous post). See below. The script is provided, as
well as the full error message.

Sorry for the long script, but basically I am plotting 3x7 arrays via
pcolormesh. The script looks pretty dum because it was adapted from a
more complicated one where the bins/pixels are not exactly squared and
are rotated. In the version below I have tried to remove the unncessary
complication. And I get a failure from ghostscript when I try to save it
as eps. It works when I save it as a png.

Can anyone tell me what's wrong there? Again I am using:

### On an OpenSuse 11.2, 64b
xpdf distiller (but I tried others).
matplotlib 0.99.1.1
backend WXAgg version 2.8.10.1
Python 2.6.2 (r262:71600, Oct 24 2009, 03:15:21)
IPython 0.10 -- An enhanced Interactive Python.

THANKS
Eric

######################################################################
# Script to run which crashes when saving the figure as an eps file
######################################################################
#!/usr/bin/python
import numpy as num
import pylab as pl

def pos(i,j, w, h) :
return [0.05+ j*(w+0.02), 0.99 - (i+1)*(h+0.023)+0.025, w, h]

## Opening the figure
## Figure
pl.figure(1, figsize=(5*1.2, 7*1.5))
fig = pl.gcf()
pl.clf()

## Size of figure
figH = fig.get_figheight()
figW = fig.get_figwidth()
w = 0.99 / 3. -0.03
h = 0.99 / 7 - 0.022

## List of data to plot (I take 7 times the same stuff)
listgal = ["1","2","3","4","5","6",",7"]

## Initialisation of start, end and step
ngal = len(listgal)
start = [-30.,-30.]
end = [30.,30.]
npix = [80,80]
x = num.linspace(start[0],end[0], npix[0])
y = num.linspace(start[1],end[1], npix[1])
step = [x[1]-x[0], y[1]-y[0]]
X,Y = num.meshgrid(x,y)

## Initialisation of data
data = num.random.random((npix[0], npix[1]))

pl.ioff()
for k in range(ngal) :
gal = listgal[k]

## Coordinates

## Grid for rotation
Xp,Yp = X - step[0]/2., Y - step[1]/2.
X1,Y1 = X+step[0]/2.,Y+step[1]/2.
X2,Y2 = X-step[0]/2.,Y+step[1]/2.
X3,Y3 = X-step[0]/2.,Y-step[1]/2.
X4,Y4 = X+step[0]/2.,Y-step[1]/2.
minXc = num.min(num.concatenate((X1,X2,X3,X4)))
maxXc = num.max(num.concatenate((X1,X2,X3,X4)))
minYc = num.min(num.concatenate((Y1,Y2,Y3,Y4)))
maxYc = num.max(num.concatenate((Y1,Y2,Y3,Y4)))
dX = maxXc - minXc
dY = maxYc - minYc

## Deriving the right aspect ratio etc
aspectIma = dX / dY
aspectFig = figW / figH
aspectWin = w / h
if (aspectIma < aspectWin*aspectFig) :
maxXc = maxXc * aspectFig * aspectWin / aspectIma
minXc = minXc * aspectFig * aspectWin / aspectIma
else :
maxYc = maxYc * aspectIma / (aspectFig * aspectWin)
minYc = minYc * aspectIma / (aspectFig * aspectWin)
extentR = minXc, maxXc, minYc, maxYc

cmap = pl.cm.jet
minI, maxI = 0., 1.
cmap.set_bad('w',1.0)
j = 0
ax1 = fig.add_axes(pos(k,j, w, h))
map1 = ax1.pcolormesh(Xp,Yp,data,shading='flat',vmin=minI,vmax=maxI,
cmap=cmap)
pl.plot([0.],[0.],'k+', markersize=10, lw=3)
xticklabels = pl.getp(pl.gca(), 'xticklabels')
pl.setp(xticklabels, fontsize=8)
yticklabels = pl.getp(pl.gca(), 'yticklabels')
pl.setp(yticklabels, fontsize=8)
pl.axis(extentR)
j += 1

ax2 = fig.add_axes(pos(k,j, w, h))
map2 = ax2.pcolormesh(Xp,Yp,data,shading='flat',vmin=minI,vmax=maxI,
cmap=cmap)
pl.plot([0.],[0.],'k+', markersize=10, lw=3)
pl.axis(extentR)
ax2.set_yticks()
xticklabels = pl.getp(pl.gca(), 'xticklabels')
pl.setp(xticklabels, fontsize=8)
pl.text(0.02,0.96, "%4.0f/%4.0f"%(minI,maxI),
verticalalignment='top',rotation='vertical',transform = ax2.transAxes,
fontsize=8)
j += 1

ax3 = fig.add_axes(pos(k,j, w, h))
map2 = ax3.pcolormesh(Xp,Yp,data,shading='flat',vmin=0.,vmax=1.,
cmap=cmap)
pl.plot([0.],[0.],'k+', markersize=10, lw=3)
pl.axis(extentR)
ax3.set_yticks()
xticklabels = pl.getp(pl.gca(), 'xticklabels')
pl.setp(xticklabels, fontsize=8)
pl.text(0.02,0.96, "%4.0f/%4.0f"%(minI,maxI),
verticalalignment='top',rotation='vertical',transform = ax3.transAxes,
fontsize=8)
j += 1
pl.text(0.92,0.5, gal,
rotation='vertical',verticalalignment='center',transform = ax3.transAxes)

k += 1

pl.ion()
pl.show()

#######################################################################
## ERROR MESSAGE WHEN DOING:
## savefig("tmp.eps")
########################################################################
savefig("toto.eps")
Error: /limitcheck in --def--
Operand stack:
pa_c2c --nostringval--
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval--
--nostringval-- 2 %stopped_push --nostringval-- --nostringval--
--nostringval-- false 1 %stopped_push 1878 1 3
%oparray_pop 1877 1 3 %oparray_pop 1861 1 3 %oparray_pop
1755 1 3 %oparray_pop --nostringval-- %errorexec_pop
.runexec2 --nostringval-- --nostringval-- --nostringval-- 2
%stopped_push --nostringval--

Dictionary stack:

--dict:1171/3371(ro)(G)-- --dict:1/20(G)-- --dict:74/200(L)--
--dict:5/6(ro)(L)-- --dict:179/300(L)-- --dict:44/200(L)--
--dict:65534/65534(L)--

Current allocation mode is local

Last OS error: 2

Current file position is 14229051

GPL Ghostscript 8.64: Unrecoverable error, exit code 1

---------------------------------------------------------------------------

RuntimeError Traceback (most recent call
last)

/science/ATLAS3D/python/Analysis/Try.py in <module>()
----> 1
2
3
4
5

/usr/lib64/python2.6/site-packages/matplotlib/pyplot.pyc in
savefig(*args, **kwargs)
354 def savefig(*args, **kwargs):

355 fig = gcf()

--> 356 return fig.savefig(*args, **kwargs)

357 if Figure.savefig.__doc__ is not None:

358 savefig.__doc__ = dedent(Figure.savefig.__doc__)

/usr/lib64/python2.6/site-packages/matplotlib/figure.pyc in
savefig(self, *args, **kwargs)
1030 patch.set_alpha(0.0)

1031

-> 1032 self.canvas.print_figure(*args, **kwargs)

1033

1034 if transparent:

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_wxagg.pyc
in print_figure(self, filename, *args, **kwargs)
98 def print_figure(self, filename, *args, **kwargs):

99         \# Use pure Agg renderer to draw

--> 100 FigureCanvasAgg.print_figure(self, filename, *args,
**kwargs)
101 # Restore the current view; this is needed because the

102 # artist contains methods rely on particular attributes

/usr/lib64/python2.6/site-packages/matplotlib/backend_bases.pyc in
print_figure(self, filename, dpi, facecolor, edgecolor, orientation,
format, **kwargs)

1474 orientation=orientation,

1475 bbox_inches_restore=_bbox_inches_restore,

-> 1476 **kwargs)

1477 finally:

1478 if bbox_inches and restore_bbox:

/usr/lib64/python2.6/site-packages/matplotlib/backend_bases.pyc in
print_eps(self, *args, **kwargs)
1327 from backends.backend_ps import FigureCanvasPS # lazy
import
1328 ps = self.switch_backends(FigureCanvasPS)

-> 1329 return ps.print_eps(*args, **kwargs)

1330

1331 def print_pdf(self, *args, **kwargs):

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
print_eps(self, outfile, *args, **kwargs)
853

854 def print_eps(self, outfile, *args, **kwargs):

--> 855 return self._print_ps(outfile, 'eps', *args, **kwargs)

856

857

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
_print_ps(self, outfile, format, *args, **kwargs)
882 self._print_figure_tex(outfile, format, imagedpi,
facecolor, edgecolor,
883 orientation, isLandscape,
papertype,
--> 884 **kwargs)

885 else:

886 self._print_figure(outfile, format, imagedpi,
facecolor, edgecolor,

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
_print_figure_tex(self, outfile, format, dpi, facecolor, edgecolor,
orientation, isLandscape, papertype, **kwargs)

1188 gs_distill(tmpfile, isEPSF, ptype=papertype,
bbox=bbox)
1189 elif rcParams['ps.usedistiller'] == 'xpdf':

-> 1190 xpdf_distill(tmpfile, isEPSF, ptype=papertype,
bbox=bbox)
1191 elif rcParams['text.usetex']:

1192 if False: pass # for debugging

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_ps.pyc in
xpdf_distill(tmpfile, eps, ptype, bbox)
1345 fh = file(outfile)
1346 if exit_status: raise RuntimeError('ps2pdf was not able to
process your \
-> 1347 image.\n\Here is the report generated by ghostscript:\n\n' +
fh.read())
1348 else: verbose.report(fh.read(), 'debug')
1349 fh.close()

RuntimeError: ps2pdf was not able to process your image.
\Here is the report generated by ghostscript:

------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

Hi
thanks A LOT for taking the time to test this and for the suggestions.

Yes, pcolormesh is needed (or at least I think) because in the "real"
example (the figures I am trying to make) the pixels are rotated meaning
that these are polygons which are not aligned with the axes. Imshow
cannot do that as far as I can tell because it shows a rectangular grid
(masked or not) aligned with the axis.

It seems indeed linked with the number of plots/memory. I have tested
this now and looked for when it crashes, Limiting the number of rows to
1, 2 , 3 etc. With 3 rows (9 plots) it works. But it crashes when I
include 4 rows. Looking at a "top" and memory usage, it is clearly a pb
with ghostscript when it takes over to transform it into the eps. Here
is the line from the "top" when it crashes:

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5980 emsellem 20 0 167m 88m 4352 R 100 2.3 0:54.45 gs

When gs go over ~170m, it crashes. Not clue why. I have ample memory
left (2Gb RAM, 2Gb Swap) and no pb of disk space.

As for the workarounds: yes I did a pdf2ps already for one urgent figure
I had to get. I just hoped that I wouldn't have to do that for all my
figures.

Never used rasterization before...
(and thanks for pointing out the mistake on map3, this came after
adapting the script for this post). I guess this means you transform it
into a resolution dependent figure. I can try it but I am afraid this
will look quite bad.

cheers
Eric

···

On 09/01/10 04:25, Jae-Joon Lee wrote:

I can reproduce this error with the current svn.

I doubt if this is a matplotlib issue, because it works fine if the
number of axes is small.
To me, it seems as some memory error in the ghostscript, but my quick
googling did not show any relevant information.
So, I hope some postscript expert take a look at the issue.

However, note that pcolormesh in backends other than agg is extremely
inefficient, and I strongly discourage its use in other backends.
Your current example could be much efficient if you simply can use
imshow. Do you have to use pcolormesh? Your current example seems to
be easily convertible to imshow, but you original example may not.

In case the use of pcolormesh is not avoidable, I can think of two workarounds.

1) save as pdf first then convert to eps. Saving as pdf will take as
much time as saving as ps.

2) Save as eps but rasterize the pcolormesh plots. This is my choice
and saving time is also not very long. As a matter of fact, whenever
pcolormesh is used, I strongly recommend to consider rasterizing it.

For your current script, you may add something like below at the end
of your for-loop.

  map1.set_zorder(0.5)
  map2.set_zorder(0.5)
  map3.set_zorder(0.5)
  ax1.set_rasterization_zorder(0.6)
  ax2.set_rasterization_zorder(0.6)
  ax3.set_rasterization_zorder(0.6)

This code needs to be inside the for-loop so that all the pcolormesh
plots get rasterized.
Also, note that, in your current script, the third pcolormesh plot is
assigned to "map2", instead of "map3", so you need to fix this first.

--

Eric Emsellem European Southern Observatory
                                        Karl-Schwarzschild Str. 2
e-mail: eemselle@...513... 85748 Garching bei Muenchen
tel: +49 (0)89 3200 6914 Germany
fax: +49 (0)89 3200 6480

Thinking about it: when matplotlib transfer the plot to ghostscript, is
there a parameter in the call for "gs" which limits the memory usage???
It seems that this is discussed in some posts about gs

Eric

···

On 09/01/10 04:25, Jae-Joon Lee wrote:

I can reproduce this error with the current svn.

I doubt if this is a matplotlib issue, because it works fine if the
number of axes is small.
To me, it seems as some memory error in the ghostscript, but my quick
googling did not show any relevant information.
So, I hope some postscript expert take a look at the issue

Hi
thanks A LOT for taking the time to test this and for the suggestions.

Yes, pcolormesh is needed (or at least I think) because in the "real"
example (the figures I am trying to make) the pixels are rotated meaning
that these are polygons which are not aligned with the axes. Imshow
cannot do that as far as I can tell because it shows a rectangular grid
(masked or not) aligned with the axis.

imshow in the current release does not support rotation.
However, imshow in the svn DOES support rotation (or any affine
transform), but for ps backend only. Here is a relevant thread. So
take a look if you're interested.

http://old.nabble.com/imshow-without-resampling-in-the-ps-backend.-tt26805182.html#a26805182

Never used rasterization before...
(and thanks for pointing out the mistake on map3, this came after
adapting the script for this post). I guess this means you transform it
into a resolution dependent figure. I can try it but I am afraid this
will look quite bad.

Yes, but only images. Other artists (lines, texts, etc.) will be in
the vector format.
As a matter of fact, images in matplotlib are always rasterized
internally (only exception is the ps backend in the svn). So, the
result will not be much different. Also, you can increase the dpi of
the output if you think output quality is poor.

Regards,

-JJ

···

On Sat, Jan 9, 2010 at 8:20 AM, Eric Emsellem <eemselle@...513...> wrote: