65

I want to use matplotlib to illustrate the definite integral between two regions: x_0, and x_1.

How can I shade a region under a curve in matplotlib from x=-1, to x=1 given the following plot

import numpy as np
from matplotlib import pyplot as plt
def f(t):
    return t * t

t = np.arange(-4,4,1/40.)
plt.plot(t,f(t))
Georgy
  • 12,464
  • 7
  • 65
  • 73
lukecampbell
  • 14,728
  • 4
  • 34
  • 32
  • I think fill_between will work. t = np.arange(-4,4,1/40.) plt.plot(t,f(t)) plt.fill_between(t,f(t),color='green') – Golden Lion Sep 29 '21 at 17:49

3 Answers3

78

The final answer I came up with is to use fill_between.

I thought there would have been a simple shade between type method, but this does exactly what I want.

section = np.arange(-1, 1, 1/20.)
plt.fill_between(section,f(section))
Azat Ibrakov
  • 9,998
  • 9
  • 38
  • 50
lukecampbell
  • 14,728
  • 4
  • 34
  • 32
29

Check out fill. Here's an example on filling a constrained region.

gspr
  • 11,144
  • 3
  • 41
  • 74
12

As said before, you should use the fill_between function from pyplot.

And to fill the desired area under the curve, I recommend using the where argument that provide a filter that fit your data:

import numpy as np
from matplotlib import pyplot as plt

def f(t):
    return t * t

t = np.arange(-4,4,1/40)

#Print the curve
plt.plot(t,f(t))

#Fill under the curve
plt.fill_between(
        x= t, 
        y1= f(t), 
        where= (-1 < t)&(t < 1),
        color= "b",
        alpha= 0.2)
        
plt.show()

The where argument accepts an array of boolean. So you can use numpy arrays operations on boolean to make it easy. As you can see in the example, I simply used : (-1 < t)&(t < 1). More details on boolean array here : http://www.math.buffalo.edu/~badzioch/MTH337/PT/PT-boolean_numpy_arrays/PT-boolean_numpy_arrays.html

You can play around with the parameters alpha (opacity) and color to make it look better. Here is the desired result :

enter image description here

The documentation of fill_between is available here : https://matplotlib.org/3.5.1/api/_as_gen/matplotlib.pyplot.fill_between.html

Clément Perroud
  • 483
  • 3
  • 12