Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Rightclick on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
From: Adam Mercer <ramercer@gm...>  20070714 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 Hunter <jdh2358@gm...>  20070714 14:49:13

On 7/14/07, Adam Mercer <ramercer@...> 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 Mercer <ramercer@gm...>  20070714 15:06:53

On 14/07/07, John Hunter <jdh2358@...> wrote: > On 7/14/07, Adam Mercer <ramercer@...> 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 Hunter <jdh2358@gm...>  20070714 15:39:29

On 7/14/07, Adam Mercer <ramercer@...> 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 Mercer <ramercer@gm...>  20070714 16:07:07
Attachments:
params.py

On 14/07/07, John Hunter <jdh2358@...> 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 minmass 4 maxmass 100 output test.png Cheers Adam > 
From: John Hunter <jdh2358@gm...>  20070714 16:47:02
Attachments:
params.py

On 7/14/07, Adam Mercer <ramercer@...> wrote: > I've attached the complete code > > ./params.py minmass 4 maxmass 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 Mercer <ramercer@gm...>  20070714 18:12:16

On 14/07/07, John Hunter <jdh2358@...> 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 Hunter <jdh2358@gm...>  20070714 18:25:19

On 7/14/07, Adam Mercer <ramercer@...> wrote: > On 14/07/07, John Hunter <jdh2358@...> 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 Mercer <ramercer@gm...>  20070715 01:32:19

On 14/07/07, John Hunter <jdh2358@...> 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 