eps output and fill_between

Hello ,

sofar I know how to safe a plot into a *.eps file and it works good,
but there is one issue with filled areas between two functions.

When I try to use:
plt.fill_between(x, pdf_min, pdf_max, color='0.85')

and I try to open it on my mac I fail. So far as I know
is the mac converting the eps internally to pdf to be
displayed, but it seems it can't be converted.

If I try to set the output to *.pdf it works perfectly and I can
open the file. Something in the combination of fill_between
and eps is causing the error. I tried also color="red" but with
the same problems.

Is there anything I've to set because I need the output as
a working eps.

/johannes

under the hool, fill_between uses a PolyCollection. Below is a simple example which uses a PolyCollection directly. Does this crash when you convert eps -> pdf. If not, maybe we can hone in on what is special about the vertices in your fill_between example. Also, you should give us some information about what version of matplotlib and OSX you are running.

import numpy as np
import matplotlib.collections as mcollections
import matplotlib.pyplot as plt

theta = np.linspace(0, 2*np.pi, 20)
x1 = np.cos(theta)
y1 = np.sin(theta)

x2 = x1 + 5

y2 = y1 + 5

verts1 = zip(x1, y1)
verts2 = zip(x2, y2)

c = mcollections.PolyCollection([verts1, verts2], facecolors=[‘red’, ‘green’])

ax = plt.subplot(111)
ax.add_collection©
ax.axis([-5, 10, -5, 10])

plt.savefig(‘test.eps’)
plt.show()

···

On Thu, May 12, 2011 at 3:42 AM, Johannes Radinger <JRadinger@…1843…> wrote:

Hello ,

sofar I know how to safe a plot into a *.eps file and it works good,

but there is one issue with filled areas between two functions.

When I try to use:

plt.fill_between(x, pdf_min, pdf_max, color=‘0.85’)

and I try to open it on my mac I fail. So far as I know

is the mac converting the eps internally to pdf to be

displayed, but it seems it can’t be converted.

If I try to set the output to *.pdf it works perfectly and I can

open the file. Something in the combination of fill_between

and eps is causing the error. I tried also color=“red” but with

the same problems.

Is there anything I’ve to set because I need the output as

a working eps.

Hello again,

I tried the script you provided to test the PolyCollection and that works fine.

I am working under Mac OS X 10.6.6 Snow Leopard and use matplotlib 1.0.1.

That is the script where I fail with eps but not with pdf:

import matplotlib.pyplot as plt

import numpy

from scipy import stats

p=0.3

m=0

s1min=120

s1max=140

s2min=1200

s2max=1600

x = numpy.arange((s2max*-1.5), (s2max*1.5), 0.2)

def pdf(x,s1,s2):

return p * stats.norm.pdf(x, loc=m, scale=s1) + (1-p) * stats.norm.pdf(x, loc=m, scale=s2)

pdf_min = pdf(x,s1min,s2min)

pdf_max = pdf(x,s1max,s2max)

plt.plot(x, pdf_min, x, pdf_max, color=“k”)

plt.fill_between(x, pdf_min, pdf_max, color=‘0.85’)

#plt.show()

#plt.savefig(“testplot.eps”)

plt.savefig(“testplot.pdf”)

/Johannes

···

Am 12.05.2011 um 15:28 schrieb John Hunter:

On Thu, May 12, 2011 at 3:42 AM, Johannes Radinger <JRadinger@…1843…> wrote:

Hello ,

sofar I know how to safe a plot into a *.eps file and it works good,

but there is one issue with filled areas between two functions.

When I try to use:

plt.fill_between(x, pdf_min, pdf_max, color=‘0.85’)

and I try to open it on my mac I fail. So far as I know

is the mac converting the eps internally to pdf to be

displayed, but it seems it can’t be converted.

If I try to set the output to *.pdf it works perfectly and I can

open the file. Something in the combination of fill_between

and eps is causing the error. I tried also color=“red” but with

the same problems.

Is there anything I’ve to set because I need the output as

a working eps.

under the hool, fill_between uses a PolyCollection. Below is a simple example which uses a PolyCollection directly. Does this crash when you convert eps -> pdf. If not, maybe we can hone in on what is special about the vertices in your fill_between example. Also, you should give us some information about what version of matplotlib and OSX you are running.

import numpy as np
import matplotlib.collections as mcollections
import matplotlib.pyplot as plt

theta = np.linspace(0, 2*np.pi, 20)
x1 = np.cos(theta)
y1 = np.sin(theta)

x2 = x1 + 5

y2 = y1 + 5

verts1 = zip(x1, y1)
verts2 = zip(x2, y2)

c = mcollections.PolyCollection([verts1, verts2], facecolors=[‘red’, ‘green’])

ax = plt.subplot(111)
ax.add_collection©
ax.axis([-5, 10, -5, 10])

plt.savefig(‘test.eps’)
plt.show()

Does anyone already know what causes the problem with the fill_between and the eps output?

/johannes

-------- Original-Nachricht --------

···

Datum: Thu, 12 May 2011 17:10:43 +0200
Von: Johannes Radinger <JRadinger@...1843...>
An: John Hunter <jdh2358@...287...>
CC: matplotlib-users@lists.sourceforge.net
Betreff: Re: [Matplotlib-users] eps output and fill_between

Hello again,

I tried the script you provided to test the PolyCollection and that works
fine.
I am working under Mac OS X 10.6.6 Snow Leopard and use matplotlib 1.0.1.

That is the script where I fail with eps but not with pdf:

import matplotlib.pyplot as plt
import numpy
from scipy import stats

p=0.3
m=0
s1min=120
s1max=140
s2min=1200
s2max=1600

x = numpy.arange((s2max*-1.5), (s2max*1.5), 0.2)

def pdf(x,s1,s2):
    return p * stats.norm.pdf(x, loc=m, scale=s1) + (1-p) *
stats.norm.pdf(x, loc=m, scale=s2)

pdf_min = pdf(x,s1min,s2min)
pdf_max = pdf(x,s1max,s2max)

plt.plot(x, pdf_min, x, pdf_max, color="k")
plt.fill_between(x, pdf_min, pdf_max, color='0.85')

#plt.show()
#plt.savefig("testplot.eps")
plt.savefig("testplot.pdf")

/Johannes

Am 12.05.2011 um 15:28 schrieb John Hunter:

>
>
> On Thu, May 12, 2011 at 3:42 AM, Johannes Radinger <JRadinger@...1843...> > wrote:
> Hello ,
>
> sofar I know how to safe a plot into a *.eps file and it works good,
> but there is one issue with filled areas between two functions.
>
> When I try to use:
> plt.fill_between(x, pdf_min, pdf_max, color='0.85')
>
> and I try to open it on my mac I fail. So far as I know
> is the mac converting the eps internally to pdf to be
> displayed, but it seems it can't be converted.
>
> If I try to set the output to *.pdf it works perfectly and I can
> open the file. Something in the combination of fill_between
> and eps is causing the error. I tried also color="red" but with
> the same problems.
>
> Is there anything I've to set because I need the output as
> a working eps.
>
>
> under the hool, fill_between uses a PolyCollection. Below is a simple
example which uses a PolyCollection directly. Does this crash when you
convert eps -> pdf. If not, maybe we can hone in on what is special about the
vertices in your fill_between example. Also, you should give us some
information about what version of matplotlib and OSX you are running.
>
>
> import numpy as np
> import matplotlib.collections as mcollections
> import matplotlib.pyplot as plt
>
> theta = np.linspace(0, 2*np.pi, 20)
> x1 = np.cos(theta)
> y1 = np.sin(theta)
>
> x2 = x1 + 5
> y2 = y1 + 5
>
> verts1 = zip(x1, y1)
> verts2 = zip(x2, y2)
>
> c = mcollections.PolyCollection([verts1, verts2], facecolors=['red',
'green'])
>
> ax = plt.subplot(111)
> ax.add_collection(c)
> ax.axis([-5, 10, -5, 10])
>
> plt.savefig('test.eps')
> plt.show()
>

--
Ihr GMX Postfach immer dabei: die kostenlose GMX Mail App für Android.
Komfortabel, sicher und schnell: www.gmx.de/android

Running it through gs (ghostscript) gives this error:

···

=====

GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /stackoverflow in -file-
Operand stack:
    --nostringval--
Execution stack:
    %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1846 1 3 %oparray_pop 1845 1 3 %oparray_pop --nostringval-- 1829 1 3 %oparray_pop 1723 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push
Dictionary stack:
    --dict:1148/1684(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)-- --dict:7/8(L)--
Current allocation mode is local
Current file position is 675310
GPL Ghostscript 8.70: Unrecoverable error, exit code 1

=====

This indicates that the Postscript is running out of stack space (memory). Indeed, the file has a very large path in it.

A little background: matplotlib includes an algorithm to "simplify" really long paths by removing points that don't actually contribute to the resulting image. Unfortunately, this algorithm only works for unfilled paths -- dealing with the more general case of filled paths is more difficult. That's why you only see this problem when using "fill_between" and not just when plotting lines.

The problem here is that it's hard to trap for this error -- the size of the Postscript stack is dependent on the Postscript interpreter being used, so what works in one place may not in another.

A simple way around this is to just decimate the data, i.e.:

   plt.plot(x[::5], pdf_min[::5], x[::5], pdf_max[::5], color="k")
   plt.fill_between(x[::5], pdf_min[::5], pdf_max[::5], color='0.85')

but obviously that's not doing anything terribly smart, so it won't work with all data.

Mike

On 05/13/2011 10:00 AM, Johannes Radinger wrote:

Does anyone already know what causes the problem with the fill_between and the eps output?

/johannes

-------- Original-Nachricht --------
   

Datum: Thu, 12 May 2011 17:10:43 +0200
Von: Johannes Radinger<JRadinger@...1843...>
An: John Hunter<jdh2358@...287...>
CC: matplotlib-users@lists.sourceforge.net
Betreff: Re: [Matplotlib-users] eps output and fill_between
     
Hello again,

I tried the script you provided to test the PolyCollection and that works
fine.
I am working under Mac OS X 10.6.6 Snow Leopard and use matplotlib 1.0.1.

That is the script where I fail with eps but not with pdf:

import matplotlib.pyplot as plt
import numpy
from scipy import stats

p=0.3
m=0
s1min=120
s1max=140
s2min=1200
s2max=1600

x = numpy.arange((s2max*-1.5), (s2max*1.5), 0.2)

def pdf(x,s1,s2):
     return p * stats.norm.pdf(x, loc=m, scale=s1) + (1-p) *
stats.norm.pdf(x, loc=m, scale=s2)

pdf_min = pdf(x,s1min,s2min)
pdf_max = pdf(x,s1max,s2max)

plt.plot(x, pdf_min, x, pdf_max, color="k")
plt.fill_between(x, pdf_min, pdf_max, color='0.85')

#plt.show()
#plt.savefig("testplot.eps")
plt.savefig("testplot.pdf")

/Johannes

Am 12.05.2011 um 15:28 schrieb John Hunter:

On Thu, May 12, 2011 at 3:42 AM, Johannes Radinger<JRadinger@...1843...> >>> >> wrote:
     
Hello ,

sofar I know how to safe a plot into a *.eps file and it works good,
but there is one issue with filled areas between two functions.

When I try to use:
plt.fill_between(x, pdf_min, pdf_max, color='0.85')

and I try to open it on my mac I fail. So far as I know
is the mac converting the eps internally to pdf to be
displayed, but it seems it can't be converted.

If I try to set the output to *.pdf it works perfectly and I can
open the file. Something in the combination of fill_between
and eps is causing the error. I tried also color="red" but with
the same problems.

Is there anything I've to set because I need the output as
a working eps.

under the hool, fill_between uses a PolyCollection. Below is a simple
       

example which uses a PolyCollection directly. Does this crash when you
convert eps -> pdf. If not, maybe we can hone in on what is special about the
vertices in your fill_between example. Also, you should give us some
information about what version of matplotlib and OSX you are running.
     

import numpy as np
import matplotlib.collections as mcollections
import matplotlib.pyplot as plt

theta = np.linspace(0, 2*np.pi, 20)
x1 = np.cos(theta)
y1 = np.sin(theta)

x2 = x1 + 5
y2 = y1 + 5

verts1 = zip(x1, y1)
verts2 = zip(x2, y2)

c = mcollections.PolyCollection([verts1, verts2], facecolors=['red',
       

'green'])
     

ax = plt.subplot(111)
ax.add_collection(c)
ax.axis([-5, 10, -5, 10])

plt.savefig('test.eps')
plt.show()

--
Michael Droettboom
Science Software Branch
Space Telescope Science Institute
Baltimore, Maryland, USA

-------- Original-Nachricht --------

Datum: Fri, 13 May 2011 10:58:15 -0400
Von: Michael Droettboom <mdroe@...86...>
An: matplotlib-users@lists.sourceforge.net
Betreff: Re: [Matplotlib-users] eps output and fill_between

Running it through gs (ghostscript) gives this error:

=====

GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /stackoverflow in -file-
Operand stack:
    --nostringval--
Execution stack:
    %interp_exit .runexec2 --nostringval-- --nostringval--
--nostringval-- 2 %stopped_push --nostringval--
--nostringval-- --nostringval-- false 1 %stopped_push 1846
1 3 %oparray_pop 1845 1 3 %oparray_pop --nostringval--
1829 1 3 %oparray_pop 1723 1 3 %oparray_pop
--nostringval-- %errorexec_pop .runexec2 --nostringval--
--nostringval-- --nostringval-- 2 %stopped_push
Dictionary stack:
    --dict:1148/1684(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)--
--dict:7/8(L)--
Current allocation mode is local
Current file position is 675310
GPL Ghostscript 8.70: Unrecoverable error, exit code 1

=====

This indicates that the Postscript is running out of stack space
(memory). Indeed, the file has a very large path in it.

A little background: matplotlib includes an algorithm to "simplify"
really long paths by removing points that don't actually contribute to
the resulting image. Unfortunately, this algorithm only works for
unfilled paths -- dealing with the more general case of filled paths is
more difficult. That's why you only see this problem when using
"fill_between" and not just when plotting lines.

The problem here is that it's hard to trap for this error -- the size of
the Postscript stack is dependent on the Postscript interpreter being
used, so what works in one place may not in another.

A simple way around this is to just decimate the data, i.e.:

   plt.plot(x[::5], pdf_min[::5], x[::5], pdf_max[::5], color="k")
   plt.fill_between(x[::5], pdf_min[::5], pdf_max[::5], color='0.85')

but obviously that's not doing anything terribly smart, so it won't work
with all data.

First thank you for that way how it works...

just some short questions, after I tried it this way (and it is working:)):
1) What does this decimate [::5] actually mean, what does it?
2) In which case will it fail if you say it won't work with all data?
3) Actually I have to use that [::5] only for the fill_between as the usual line plot works, or am I wrong?

/johannes

···

Mike

On 05/13/2011 10:00 AM, Johannes Radinger wrote:
> Does anyone already know what causes the problem with the fill_between
and the eps output?
>
> /johannes
>
>
> -------- Original-Nachricht --------
>
>> Datum: Thu, 12 May 2011 17:10:43 +0200
>> Von: Johannes Radinger<JRadinger@...1843...>
>> An: John Hunter<jdh2358@...287...>
>> CC: matplotlib-users@lists.sourceforge.net
>> Betreff: Re: [Matplotlib-users] eps output and fill_between
>>
>
>> Hello again,
>>
>> I tried the script you provided to test the PolyCollection and that
works
>> fine.
>> I am working under Mac OS X 10.6.6 Snow Leopard and use matplotlib
1.0.1.
>>
>> That is the script where I fail with eps but not with pdf:
>>
>>
>>
>> import matplotlib.pyplot as plt
>> import numpy
>> from scipy import stats
>>
>> p=0.3
>> m=0
>> s1min=120
>> s1max=140
>> s2min=1200
>> s2max=1600
>>
>> x = numpy.arange((s2max*-1.5), (s2max*1.5), 0.2)
>>
>> def pdf(x,s1,s2):
>> return p * stats.norm.pdf(x, loc=m, scale=s1) + (1-p) *
>> stats.norm.pdf(x, loc=m, scale=s2)
>>
>>
>> pdf_min = pdf(x,s1min,s2min)
>> pdf_max = pdf(x,s1max,s2max)
>>
>> plt.plot(x, pdf_min, x, pdf_max, color="k")
>> plt.fill_between(x, pdf_min, pdf_max, color='0.85')
>>
>>
>> #plt.show()
>> #plt.savefig("testplot.eps")
>> plt.savefig("testplot.pdf")
>>
>>
>> /Johannes
>>
>> Am 12.05.2011 um 15:28 schrieb John Hunter:
>>
>>
>>>
>>> On Thu, May 12, 2011 at 3:42 AM, Johannes Radinger<JRadinger@...1843...> > >>> > >> wrote:
>>
>>> Hello ,
>>>
>>> sofar I know how to safe a plot into a *.eps file and it works good,
>>> but there is one issue with filled areas between two functions.
>>>
>>> When I try to use:
>>> plt.fill_between(x, pdf_min, pdf_max, color='0.85')
>>>
>>> and I try to open it on my mac I fail. So far as I know
>>> is the mac converting the eps internally to pdf to be
>>> displayed, but it seems it can't be converted.
>>>
>>> If I try to set the output to *.pdf it works perfectly and I can
>>> open the file. Something in the combination of fill_between
>>> and eps is causing the error. I tried also color="red" but with
>>> the same problems.
>>>
>>> Is there anything I've to set because I need the output as
>>> a working eps.
>>>
>>>
>>> under the hool, fill_between uses a PolyCollection. Below is a simple
>>>
>> example which uses a PolyCollection directly. Does this crash when you
>> convert eps -> pdf. If not, maybe we can hone in on what is special
about the
>> vertices in your fill_between example. Also, you should give us some
>> information about what version of matplotlib and OSX you are running.
>>
>>>
>>> import numpy as np
>>> import matplotlib.collections as mcollections
>>> import matplotlib.pyplot as plt
>>>
>>> theta = np.linspace(0, 2*np.pi, 20)
>>> x1 = np.cos(theta)
>>> y1 = np.sin(theta)
>>>
>>> x2 = x1 + 5
>>> y2 = y1 + 5
>>>
>>> verts1 = zip(x1, y1)
>>> verts2 = zip(x2, y2)
>>>
>>> c = mcollections.PolyCollection([verts1, verts2], facecolors=['red',
>>>
>> 'green'])
>>
>>> ax = plt.subplot(111)
>>> ax.add_collection(c)
>>> ax.axis([-5, 10, -5, 10])
>>>
>>> plt.savefig('test.eps')
>>> plt.show()
>>>
>>>
>>
>

--
Michael Droettboom
Science Software Branch
Space Telescope Science Institute
Baltimore, Maryland, USA

------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

--
NEU: FreePhone - kostenlos mobil telefonieren und surfen!
Jetzt informieren: http://www.gmx.net/de/go/freephone

-------- Original-Nachricht --------

Datum: Fri, 13 May 2011 10:58:15 -0400
Von: Michael Droettboom<mdroe@...86...>
An: matplotlib-users@lists.sourceforge.net
Betreff: Re: [Matplotlib-users] eps output and fill_between

Running it through gs (ghostscript) gives this error:

=====

GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /stackoverflow in -file-
Operand stack:
     --nostringval--
Execution stack:
     %interp_exit .runexec2 --nostringval-- --nostringval--
--nostringval-- 2 %stopped_push --nostringval--
--nostringval-- --nostringval-- false 1 %stopped_push 1846
1 3 %oparray_pop 1845 1 3 %oparray_pop --nostringval--
1829 1 3 %oparray_pop 1723 1 3 %oparray_pop
--nostringval-- %errorexec_pop .runexec2 --nostringval--
--nostringval-- --nostringval-- 2 %stopped_push
Dictionary stack:
     --dict:1148/1684(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)--
--dict:7/8(L)--
Current allocation mode is local
Current file position is 675310
GPL Ghostscript 8.70: Unrecoverable error, exit code 1

=====

This indicates that the Postscript is running out of stack space
(memory). Indeed, the file has a very large path in it.

A little background: matplotlib includes an algorithm to "simplify"
really long paths by removing points that don't actually contribute to
the resulting image. Unfortunately, this algorithm only works for
unfilled paths -- dealing with the more general case of filled paths is
more difficult. That's why you only see this problem when using
"fill_between" and not just when plotting lines.

The problem here is that it's hard to trap for this error -- the size of
the Postscript stack is dependent on the Postscript interpreter being
used, so what works in one place may not in another.

A simple way around this is to just decimate the data, i.e.:

    plt.plot(x[::5], pdf_min[::5], x[::5], pdf_max[::5], color="k")
    plt.fill_between(x[::5], pdf_min[::5], pdf_max[::5], color='0.85')

but obviously that's not doing anything terribly smart, so it won't work
with all data.

First thank you for that way how it works...

just some short questions, after I tried it this way (and it is working:)):
1) What does this decimate [::5] actually mean, what does it?

It takes every 5th point and ignores the rest. It is an example of python slicing, which means taking a uniformly-spaced subset of a sequence.

2) In which case will it fail if you say it won't work with all data?

Two failure modes: (1) if taking every 5th point still leaves too many points; (2) if taking every 5th point leaves out points that would have an important effect on the shape of the curve, so the figure you end up with is not an accurate representation of what you are trying to plot.

3) Actually I have to use that [::5] only for the fill_between as the usual line plot works, or am I wrong?

Correct. What Mike is saying is that for ordinary lines, mpl has a sophisticated algorithm for eliminating points that don't affect what one sees in the figure, so it is much less likely that the postscript renderer will run out of stack space; but this algorithm is not used for filled regions because points that are not needed for representing a line might still be needed for a filled region.

Eric

···

On 05/13/2011 05:19 AM, Johannes Radinger wrote:

/johannes