From: Johannes R. <JRa...@gm...> - 2011-05-12 08:43:05
|
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 |
From: John H. <jd...@gm...> - 2011-05-12 13:29:20
|
On Thu, May 12, 2011 at 3:42 AM, Johannes Radinger <JRa...@gm...> 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() |
From: Johannes R. <JRa...@gm...> - 2011-05-12 15:10:55
|
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 <JRa...@gm...> 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() > |
From: Johannes R. <JRa...@gm...> - 2011-05-13 14:00:43
|
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 <JRa...@gm...> > An: John Hunter <jd...@gm...> > CC: mat...@li... > 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 <JRa...@gm...> > 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 |
From: Michael D. <md...@st...> - 2011-05-13 14:58:17
|
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<JRa...@gm...> >> An: John Hunter<jd...@gm...> >> CC: mat...@li... >> 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<JRa...@gm...> >>> >> 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 |
From: Johannes R. <JRa...@gm...> - 2011-05-13 15:20:06
|
-------- Original-Nachricht -------- > Datum: Fri, 13 May 2011 10:58:15 -0400 > Von: Michael Droettboom <md...@st...> > An: mat...@li... > 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<JRa...@gm...> > >> An: John Hunter<jd...@gm...> > >> CC: mat...@li... > >> 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<JRa...@gm...> > >>> > >> 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 > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- NEU: FreePhone - kostenlos mobil telefonieren und surfen! Jetzt informieren: http://www.gmx.net/de/go/freephone |
From: Eric F. <ef...@ha...> - 2011-05-13 18:43:12
|
On 05/13/2011 05:19 AM, Johannes Radinger wrote: > > -------- Original-Nachricht -------- >> Datum: Fri, 13 May 2011 10:58:15 -0400 >> Von: Michael Droettboom<md...@st...> >> An: mat...@li... >> 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 > > /johannes |