|
From: Adam M. <ram...@gm...> - 2007-07-14 14:38:32
|
Hi
I'm trying to shade a couple of areas of a plot I'm creating, I need
to shade the area above one line and the area below another.
According to the documentation it looks like I need to use the fill()
method but I can't get it to work, the code I use for creating the
plot is below:
# import required modules from matplotlib
import matplotlib
from matplotlib import figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
# set matplotlib plot parameters
matplotlib.rcParams.update({
"font.size": 8.0,
"axes.titlesize": 10.0,
"axes.labelsize": 10.0,
"xtick.labelsize": 8.0,
"ytick.labelsize": 8.0,
"legend.fontsize": 8.0,
"figure.dpi": 300,
"savefig.dpi": 300,
"text.usetex": True
})
def parameter_space_plot(options):
# setup figure
fig = figure.Figure()
FigureCanvas(fig)
fig.set_size_inches(5, 5)
axes = fig.gca()
axes.grid(True)
axes.set_xlabel("Mass 1 / $M_\odot$")
axes.set_ylabel("Mass 2 / $M_\odot$")
# setup mass array
mass = numpy.arange(0, options.max_mass + 1, 1)
# plot min/max mass lines
axes.plot(mass, minimum_mass(options, mass), 'b-')
axes.plot(mass, maximum_mass(options, mass), 'b-')
# plot equal mass line
axes.plot(mass, mass, 'k--')
# set axes limits
axes.set_xlim([0, options.max_mass])
axes.set_ylim([0, options.max_mass])
# return plot
return fig
could anyone give me pointers as to how I could shade the region of
the plot about the maximum mass line and the area below the minimum
mass line?
Cheers
Adam
|
|
From: John H. <jd...@gm...> - 2007-07-14 14:49:13
|
On 7/14/07, Adam Mercer <ram...@gm...> wrote: > I'm trying to shade a couple of areas of a plot I'm creating, I need > to shade the area above one line and the area below another. > According to the documentation it looks like I need to use the fill() > method but I can't get it to work, the code I use for creating the > plot is below: The cookbook entry http://www.scipy.org/Cookbook/Matplotlib/SigmoidalFunctions illustrates how to fill below lines -- it is a little more complicated, because it fills below the intersection of two lines, but it should help. See also http://matplotlib.sf.net/examples/fill_demo.py JDH |
|
From: Adam M. <ram...@gm...> - 2007-07-14 15:06:53
|
On 14/07/07, John Hunter <jd...@gm...> wrote: > On 7/14/07, Adam Mercer <ram...@gm...> wrote: > > > I'm trying to shade a couple of areas of a plot I'm creating, I need > > to shade the area above one line and the area below another. > > According to the documentation it looks like I need to use the fill() > > method but I can't get it to work, the code I use for creating the > > plot is below: > > The cookbook entry > > http://www.scipy.org/Cookbook/Matplotlib/SigmoidalFunctions > > illustrates how to fill below lines -- it is a little more > complicated, because it fills below the intersection of two lines, but > it should help. See also > http://matplotlib.sf.net/examples/fill_demo.py I found these examples whilst trying to get the fill() method to work but couldn't get anything working. I added the line axes.fill(mass, minimum_mass(options, mass), facecolor='red', alpha=0.5) which, if I'm following the example correctly, should fill the area under the minimum mass line red, but it has no effect on the plot. Cheers Adam |
|
From: John H. <jd...@gm...> - 2007-07-14 15:39:29
|
On 7/14/07, Adam Mercer <ram...@gm...> wrote: > I found these examples whilst trying to get the fill() method to work > but couldn't get anything working. I added the line > > axes.fill(mass, minimum_mass(options, mass), facecolor='red', alpha=0.5) > > which, if I'm following the example correctly, should fill the area > under the minimum mass line red, but it has no effect on the plot. OK, you'll probably need to give us a complete, free standing example for us to debug this. |
|
From: Adam M. <ram...@gm...> - 2007-07-14 16:07:07
Attachments:
params.py
|
On 14/07/07, John Hunter <jd...@gm...> wrote: > OK, you'll probably need to give us a complete, free standing example > for us to debug this. I've attached the complete code ./params.py --min-mass 4 --max-mass 100 --output test.png Cheers Adam > |
|
From: John H. <jd...@gm...> - 2007-07-14 16:47:02
Attachments:
params.py
|
On 7/14/07, Adam Mercer <ram...@gm...> wrote: > I've attached the complete code > > ./params.py --min-mass 4 --max-mass 100 --output test.png OK, the problem with this code is fill expects the vertices of the polygon you want filled and you are only providing the top part, not the bottom. The modified version of your code fills between your line and the bottom of zero We do need to provide some helper functions to make this easier |
|
From: Adam M. <ram...@gm...> - 2007-07-14 18:12:16
|
On 14/07/07, John Hunter <jd...@gm...> wrote: > OK, the problem with this code is fill expects the vertices of the > polygon you want filled and you are only providing the top part, not > the bottom. The modified version of your code fills between your line > and the bottom of zero Thanks John, that works great! Cheers Adam |
|
From: John H. <jd...@gm...> - 2007-07-14 18:25:19
|
On 7/14/07, Adam Mercer <ram...@gm...> wrote:
> On 14/07/07, John Hunter <jd...@gm...> wrote:
>
> > OK, the problem with this code is fill expects the vertices of the
> > polygon you want filled and you are only providing the top part, not
> > the bottom. The modified version of your code fills between your line
> > and the bottom of zero
>
> Thanks John, that works great!
You're welcome. If you are a svn user, I added a more efficient
poly_between to matplotlib.mlab and updated the fill_between.py
example, which shows filling below, above and between.
def poly_between(x, ylower, yupper):
"""
given a sequence of x, ylower and yupper, return the polygon that
fills the regions between them. ylower or yupper can be scalar or
iterable. If they are iterable, they must be equal in length to x
return value is x, y arrays for use with Axes.fill
"""
Nx = len(x)
if not iterable(ylower):
ylower = ylower*npy.ones(Nx)
if not iterable(yupper):
yupper = yupper*npy.ones(Nx)
x = npy.concatenate( (x, x[::-1]) )
y = npy.concatenate( (yupper, ylower[::-1]) )
return x,y
|
|
From: Adam M. <ram...@gm...> - 2007-07-15 01:32:19
|
On 14/07/07, John Hunter <jd...@gm...> wrote: > > Thanks John, that works great! > > You're welcome. If you are a svn user, I added a more efficient > poly_between to matplotlib.mlab and updated the fill_between.py > example, which shows filling below, above and between. Thanks John, I'll take a look. Cheers Adam |