Vladimir Vargas
Vladimir Vargas

Reputation: 1824

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.

Upvotes: 4

Views: 3156

Answers (1)

ssm
ssm

Reputation: 5373

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()

Upvotes: 2

Related Questions