Search code examples
pythonmatplotlibfill

Python, How to fill between multiple (4) curves?


fig = plt.figure(num=1)
ax=fig.add_subplot(111)

def f1(x):
    return 1/x
def f2(x):
  return 2/x
def f3(x):
  return np.sqrt(x**2-1)
def f4(x):
  return np.sqrt(x**2-2)
s= np.arange(np.sqrt(2),5,0.05)
t=np.arange(1,5,0.05)
y1=f1(t)
y2=f2(t)
y3=f3(t)
y4=f4(s)
ax.plot(t,y1,'k-',t,y2,'k-',t,y3,'k-',s,y4,'k-')
plt.xlim([1.1,2.1])
plt.ylim([0.5,1.5])
plt.show()

I would like to fill the area between the curves described by those four functions. Not sure how to use the fill_between option in this case.


Solution

  • You can only fill_between two curves not four. So using the four curves that you have, you can create two curvers, y5 and y6 which I have shown below, and then use these to fill_between them. An example is shown below:

    I have also ploted the individual functions using symbols so that it is easy to see the different new curves just created ...

    import pylab as plt 
    import numpy as np 
    
    fig = plt.figure(num=1)
    ax=fig.add_subplot(111)
    
    def f1(x): return 1/x
    def f2(x): return 2/x
    def f3(x): return np.sqrt(x**2-1)
    def f4(x): return np.sqrt(x**2-2)
    
    t=np.arange(1,5,1e-4) # use this if you want a better fill
    t=np.arange(1,5,0.05)
    y1=f1(t)
    y2=f2(t)
    y3=f3(t)
    y4=f4(t*(t**2>2) + np.sqrt(2)*(t**2<=2) ) # Condition checking
    
    y5 = np.array(map(min, zip(y2, y3)))
    y6 = np.array(map(max, zip(y1, y4)))
    
    ax.plot(t,y1, 'red')
    ax.plot(t,y2, 'blue')
    ax.plot(t,y3, 'green')
    ax.plot(t,y4, 'purple')
    
    ax.plot(t, y5, '+', ms=5, mfc='None', mec='black')
    ax.plot(t, y6, 's', ms=5, mfc='None', mec='black')
    
    ax.fill_between(t, y5, y6, where=y5>=y6)
    
    plt.xlim([1.1,2.1])
    plt.ylim([0.5,1.5])
    
    plt.show()